什么是__memset_sse2,为什么它会执行这么多指令?

时间:2017-04-16 23:26:40

标签: c++ performance

我有一个算法的两个C ++实现,称它们为ABAB之间的唯一区别是A使用std::unordered_map<int, int> hashmap;B使用google::dense_hash_map<int, int> hashmap;

我找到了一个输入,其中AB相比要慢得多,我无法理解为什么。

对于相同的输入,我运行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,为什么它会执行如此多的指示?

1 个答案:

答案 0 :(得分:5)

__memset_sse2用于memset memset功能,该功能针对支持implementations的体系结构进行了优化。当你看到它花费大约三分之二的执行时间时,这意味着大部分时间都用于初始化一块具有相对较大大小的内存。哈希表可能使用google::dense_hash_map来初始化其哈希桶。

{{1}}似乎针对大小进行了优化,因此在运行示例时无需初始化尽可能多的内存。

注意:初始化占用CPU时间三分之二的观察结果可能意味着您的基准测试设计不正确。您通过哈希容器放入的数据量可能相对较小,或者您在每次运行中都不断重建容器。