我有一个算法的两个C ++实现,称它们为A
和B
。 A
和B
之间的唯一区别是A
使用std::unordered_map<int, int> hashmap;
但B
使用google::dense_hash_map<int, int> hashmap;
。
我找到了一个输入,其中A
与B
相比要慢得多,我无法理解为什么。
对于相同的输入,我运行sudo perf record -e instructions ./A input.txt
然后我得到了这个结果:
Overhead Command Shared Object Symbol
65.90% A libc-2.23.so [.] __memset_sse2
6.63% A libc-2.23.so [.] _int_malloc
3.44% A libc-2.23.so [.] malloc
2.61% A libc-2.23.so [.] _int_free
当我为B
执行相同操作时更快,我得到以下内容:
Overhead Command Shared Object Symbol
15.17% B libc-2.23.so [.] _int_malloc
14.94% B B [.] B::func1()
5.72% B B [.] B::func2()
5.58% B B [.] B::func3()
什么是__memset_sse2
,为什么它会执行如此多的指示?
答案 0 :(得分:5)
__memset_sse2
用于memset
memset
功能,该功能针对支持implementations的体系结构进行了优化。当你看到它花费大约三分之二的执行时间时,这意味着大部分时间都用于初始化一块具有相对较大大小的内存。哈希表可能使用google::dense_hash_map
来初始化其哈希桶。
{{1}}似乎针对大小进行了优化,因此在运行示例时无需初始化尽可能多的内存。
注意:初始化占用CPU时间三分之二的观察结果可能意味着您的基准测试设计不正确。您通过哈希容器放入的数据量可能相对较小,或者您在每次运行中都不断重建容器。