https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71995
Bug ID: 71995
Summary: ~36% compile-time performance regression for C++ in
gcc HEAD vs gcc-6-branch HEAD
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: tom at honermann dot net
Target Milestone: ---
A compile-time performance degradation in gcc HEAD (r238592) vs gcc-6-branch
HEAD (r238587) was observed while verifying performance improvements for bug
67565. Though that bug was specific to C++ concepts, the performance
regression is not.
In my tests both the gcc and gcc-6-branch compilers were built using the Ubuntu
15.10 x86_64 distribution of gcc 5.2.1:
$ gcc --version
gcc (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010
...
Both gcc builds were configured and built with:
$ ./configure \
CC=gcc \
CXX=g++ \
--prefix /path/to/install/... \
--disable-multilib \
--disable-bootstrap \
--enable-languages=c,c++
$ make
$ make install
The following code was used for testing:
$ cat t.cpp
/*
* Test adapted from:
* https://randomascii.wordpress.com/2014/03/10/making-compiles-slow
*/
#if !defined(SCALE_FACTOR)
#define SCALE_FACTOR 23
#endif
template<int R, int N>
struct slow_fibonacci {
static constexpr int value =
slow_fibonacci<R, N-1>::value +
slow_fibonacci<R + (1<<N), N-2>::value;
};
template<int R>
struct slow_fibonacci<R,2> {
static constexpr int value = 1;
};
template<int R>
struct slow_fibonacci<R,1> {
static constexpr int value = 1;
};
constexpr int x = slow_fibonacci<0,SCALE_FACTOR>::value;
The test was performed three times at each of three scale factors for each
compiler build, the times averaged for each scale factor, and then percentages
calculated.
Compile times using the gcc trunk build:
# default SCALE_FACTOR=23
$ time g++ -c -std=c++11 t.cpp
real 0m02.079s | real 0m02.089s | real 0m02.070s
user 0m02.004s | user 0m02.016s | user 0m02.000s
sys 0m00.068s | sys 0m00.068s | sys 0m00.064s
# SCALE_FACTOR=25
$ time g++ -c -std=c++11 -DSCALE_FACTOR=25 t.cpp
real 0m05.401s | real 0m05.431s | real 0m05.428s
user 0m05.224s | user 0m05.272s | user 0m05.224s
sys 0m00.172s | sys 0m00.156s | sys 0m00.204s
# SCALE_FACTOR=27
$ time g++ -c -std=c++11 -DSCALE_FACTOR=27 t.cpp
real 0m14.268s | real 0m14.379s | real 0m14.654s
user 0m13.912s | user 0m13.900s | user 0m14.332s
sys 0m00.356s | sys 0m00.480s | sys 0m00.320s
Compile times using the gcc-6-branch build:
# default SCALE_FACTOR=23
$ time g++ -c -std=c++11 t.cpp
real 0m01.466s | real 0m01.432s | real 0m01.441s
user 0m01.384s | user 0m01.320s | user 0m01.356s
sys 0m00.076s | sys 0m00.108s | sys 0m00.080s
# SCALE_FACTOR=25
$ time g++ -c -std=c++11 -DSCALE_FACTOR=25 t.cpp
real 0m04.076s | real 0m04.072s | real 0m04.366s
user 0m03.868s | user 0m03.920s | user 0m04.208s
sys 0m00.204s | sys 0m00.148s | sys 0m00.152s
# SCALE_FACTOR=27
$ time g++ -c -std=c++11 -DSCALE_FACTOR=27 t.cpp
real 0m10.658s | real 0m10.701s | real 0m10.779s
user 0m10.096s | user 0m10.292s | user 0m10.368s
sys 0m00.560s | sys 0m00.408s | sys 0m00.412s
-------------+---------------+------------------+---------------------+
SCALE_FACTOR | gcc trunk avg | gcc-6-branch avg | % change |
-------------+---------------+------------------+---------------------+
23 | 2.079s | 1.446s | +43.776% / -30.447% |
25 | 5.420s | 4.171s | +29.945% / -23.044% |
27 | 14.434s | 10.713s | +34.734% / -25.779% |
-------------+---------------+------------------+---------------------+
Averaging the percentages suggests ~36% performance overhead for gcc trunk vs
gcc-6-branch.