https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68303
Bug ID: 68303 Summary: performance: unordered_map&co. up to 7x speedup Product: gcc Version: 5.1.1 Status: UNCONFIRMED Severity: enhancement Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: jan.kratochvil at redhat dot com Target Milestone: --- libstdc++ spends most of the time on: div %rdi computing modulo even when commonly the container is empty(). Moreover for small size()s it is more effective to iterate the container rather than calculating the modulo. ----------------------------------------------------------------- template<class From,class To> class unordered_map_find:public unordered_map<From,To> { private: const size_t find_max_size=20; public: /***/ iterator find(const From &k) /***/ { if (unordered_map<From,To>::size()>find_max_size) // too big? return unordered_map<From,To>::find(k); for (auto it=unordered_map<From,To>::begin();;++it) // small => iterate if (it==unordered_map<From,To>::end()||it->first==k) return it; } }; #define unordered_map unordered_map_find ----------------------------------------------------------------- gcc-5.1.1-4.fc23.x86_64 g++ -o findbench findbench.C -Wall -g -std=c++11 -O3;sync;for i in `seq 0 30`;do ./findbench $i;done orig wrapped ----------- ----------- 0=1.094465 0=0.157921 1=1.119786 1=0.183768 2=1.169548 2=0.279629 3=1.347452 3=0.407056 4=1.479790 4=0.415102 5=1.301983 5=0.516378 6=1.326878 6=0.629252 7=1.467088 7=0.672654 8=1.681829 8=0.632880 9=1.755480 9=0.656492 10=1.712439 10=0.900121 11=1.515782 11=0.791073 12=1.351241 12=0.837695 13=1.434103 13=0.948055 14=1.671421 14=1.114046 15=1.683168 15=1.055906 16=1.521289 16=1.295058 17=1.537086 17=1.219568 18=1.766316 18=1.304961 19=1.807524 19=1.544631 20=1.848499 20=2.530600 21=1.895775 21=1.911767 22=1.792831 22=1.813895 23=1.562995 23=1.399753 24=1.560324 24=1.583886 25=1.419246 25=1.481225 26=1.609419 26=1.625853 27=1.482955 27=1.498665 28=1.483937 28=1.509582 29=1.506504 29=1.680078 30=1.522410 30=1.564460