This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/21314] New: C++ performance regression with -Os
- From: "deemkay at gmail dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 1 May 2005 08:30:44 -0000
- Subject: [Bug c++/21314] New: C++ performance regression with -Os
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
the following code takes more than twice as long to run when compiled with -Os
using gcc-4.0.0 than it does with 3.3.5 or 3.4.3.
#include <stdio.h>
#include <vector>
class mytype_A {
public:
int id;
mytype_A():id(0) {}
};
class mytype_B {
public:
mytype_A* A;
mytype_B(mytype_A* p):A(p) {}
};
class mytype_C {
public:
mytype_B* B;
mytype_C(mytype_B* p):B(p) {}
};
class mytype_D {
public:
// mytype_C* C[2]; // less performance difference if we use simple arrays
std::vector<mytype_C*> C;
int junk[3]; // affects performance
public:
mytype_D(mytype_A* a0, mytype_A* a1) {
// C[0] = new mytype_C(new mytype_B(a0));
// C[1] = new mytype_C(new mytype_B(a0));
C.push_back(new mytype_C(new mytype_B(a0)));
C.push_back(new mytype_C(new mytype_B(a0)));
}
};
int main() {
int k = 5000; // run-time not linear in k
mytype_A* A[k];
mytype_D* D[k];
for (int i=0;i<=k;i++)
A[i] = new mytype_A();
for (int i=0;i<k;i++)
D[i] = new mytype_D(A[i],A[k-i]); // intentionally make some pointers
farther apart
clock_t before = clock();
int k0 = 0;
for (int i=0;i<k;i++) {
k0 = 0;
for (int j=0;j<k;j++) { // run through list of D's, and reference
pointers
mytype_D* d = D[j];
if (d->C[0]->B->A->id) k0++;
if (d->C[1]->B->A->id) k0++;
}
}
printf("%d\n",k0); // don't allow compiler to optimize away k0
printf("time: %f\n",(double)(clock()-before)/CLOCKS_PER_SEC);
return 0;
}
dirtyepic ~/work $ g++ -Os -Wall -march=pentium3 cpptest.cpp
i686-pc-linux-gnu-3.3.5-20050130 - time: 6.530000
i686-pc-linux-gnu-3.4.3-20050110 - time: 6.920000
i686-pc-linux-gnu-4.0.0(release) - time: 16.790000
i686-pc-linux-gnu-4.0.0-20050430 - time: 16.700000
dirtyepic ~/work $ g++ -v -save-temps -Os -Wall -march=pentium3 cpptest.cpp -o
gcc401
Using built-in specs.
Target: i686-pc-linux-gnu
Configured with:
/var/tmp/portage/gcc-4.0.1_alpha20050430/work/gcc-4.0-20050430/configure
--enable-version-specific-runtime-libs --prefix=/usr
--bindir=/usr/i686-pc-linux-gnu/gcc-bin/4.0.1-alpha20050430
--includedir=/usr/lib/gcc/i686-pc-linux-gnu/4.0.1-alpha20050430/include
--datadir=/usr/share/gcc-data/i686-pc-linux-gnu/4.0.1-alpha20050430
--mandir=/usr/share/gcc-data/i686-pc-linux-gnu/4.0.1-alpha20050430/man
--infodir=/usr/share/gcc-data/i686-pc-linux-gnu/4.0.1-alpha20050430/info
--with-gxx-include-dir=/usr/lib/gcc/i686-pc-linux-gnu/4.0.1-alpha20050430/include/g++-v4
--host=i686-pc-linux-gnu --build=i686-pc-linux-gnu --disable-altivec
--disable-nls --with-system-zlib --disable-checking --disable-werror
--disable-libunwind-exceptions --disable-multilib --disable-libgcj
--enable-languages=c,c++ --enable-shared --enable-threads=posix
--enable-__cxa_atexit --enable-clocale=gnu
Thread model: posix
gcc version 4.0.1-alpha20050430 (Gentoo Linux 4.0.1_alpha20050430)
/usr/libexec/gcc/i686-pc-linux-gnu/4.0.1-alpha20050430/cc1plus -E -quiet -v
-D_GNU_SOURCE cpptest.cpp -march=pentium3 -Wall -Os -fpch-preprocess -o cpptest.ii
ignoring nonexistent directory "/usr/local/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/i686-pc-linux-gnu/4.0.1-alpha20050430/include/g++-v4
/usr/lib/gcc/i686-pc-linux-gnu/4.0.1-alpha20050430/include/g++-v4/i686-pc-linux-gnu
/usr/lib/gcc/i686-pc-linux-gnu/4.0.1-alpha20050430/include/g++-v4/backward
/usr/lib/gcc/i686-pc-linux-gnu/4.0.1-alpha20050430/include
/usr/lib/gcc/i686-pc-linux-gnu/4.0.1-alpha20050430/../../../../i686-pc-linux-gnu/include
/usr/include
End of search list.
/usr/libexec/gcc/i686-pc-linux-gnu/4.0.1-alpha20050430/cc1plus -fpreprocessed
cpptest.ii -quiet -dumpbase cpptest.cpp -march=pentium3 -auxbase cpptest -Os
-Wall -version -o cpptest.s
GNU C++ version 4.0.1-alpha20050430 (Gentoo Linux 4.0.1_alpha20050430)
(i686-pc-linux-gnu)
compiled by GNU C version 4.0.1-alpha20050430 (Gentoo Linux 4.0.1_alpha20050430).
GGC heuristics: --param ggc-min-expand=55 --param ggc-min-heapsize=48339
/usr/lib/gcc/i686-pc-linux-gnu/4.0.1-alpha20050430/../../../../i686-pc-linux-gnu/bin/as
-V -Qy -o cpptest.o cpptest.s
GNU assembler version 2.16.90.0.2 (i686-pc-linux-gnu) using BFD version
2.16.90.0.2 20050429
/usr/libexec/gcc/i686-pc-linux-gnu/4.0.1-alpha20050430/collect2 --eh-frame-hdr
-m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o gcc401
/usr/lib/gcc/i686-pc-linux-gnu/4.0.1-alpha20050430/../../../crt1.o
/usr/lib/gcc/i686-pc-linux-gnu/4.0.1-alpha20050430/../../../crti.o
/usr/lib/gcc/i686-pc-linux-gnu/4.0.1-alpha20050430/crtbegin.o
-L/usr/lib/gcc/i686-pc-linux-gnu/4.0.1-alpha20050430
-L/usr/lib/gcc/i686-pc-linux-gnu/4.0.1-alpha20050430
-L/usr/lib/gcc/i686-pc-linux-gnu/4.0.1-alpha20050430/../../../../i686-pc-linux-gnu/lib
-L/usr/lib/gcc/i686-pc-linux-gnu/4.0.1-alpha20050430/../../.. cpptest.o -lstdc++
-lm -lgcc_s -lgcc -lc -lgcc_s -lgcc
/usr/lib/gcc/i686-pc-linux-gnu/4.0.1-alpha20050430/crtend.o
/usr/lib/gcc/i686-pc-linux-gnu/4.0.1-alpha20050430/../../../crtn.o
--
Summary: C++ performance regression with -Os
Product: gcc
Version: 4.0.0
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: deemkay at gmail dot com
CC: gcc-bugs at gcc dot gnu dot org
GCC build triplet: i686-pc-linux-gnu
GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21314