https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67153
Bug ID: 67153
Summary: integer optimizations 53% slower than std::bitset<>
Product: gcc
Version: 5.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: ncm at cantrip dot org
Target Milestone: ---
Created attachment 36146
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=36146&action=edit
The std::bitset<> version
I have attached two small, semantically equivalent C++14 programs.
One uses std::bitset<26> for its operations; the other uses raw unsigned int.
The one that uses unsigned int runs 53% slower than the bitset<> version, as
compiled with g++-5.1 and running on a 2013-era Haswell i7-4770. While this
represents, perhaps, a stunning triumph in the optimization of inline member
and lambda functions operating on structs, it may represent an equally
intensely embarrassing, even mystifying, failure for optimization of the
underlying raw integer operations.
For both, build and test was with
$ g++-5 -O3 -march=native -mtune=native -g3 -Wall $PROG.cc
$ time ./a.out | wc -l
2818
Times on a 3.2GHz Haswell are consistently 0.25s for the unsigned int
version, 0.16s for the std::bitset<26> version.
These programs are archived at <https://github.com/ncm/nytm-spelling-bee/>.
The runtimes of the two versions are identical as built and run on my
2009 Westmere 2.4GHz i5-M520, and about the same as the integer version
on Haswell.