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

jsg*_*guy 4 c++ performance

我有两个C++算法的实现,给他们打电话AB.A和之间的唯一区别BA使用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
Run Code Online (Sandbox Code Playgroud)

当我做同样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()
Run Code Online (Sandbox Code Playgroud)

__memset_sse2它是什么以及为什么执行如此多的指令?

das*_*ght 5

__memset_sse2用于为支持SSE2的体系结构优化的函数的实现.当你看到它花费大约三分之二的执行时间时,这意味着大部分时间都用于初始化一块具有相对较大大小的内存.哈希表可能用于初始化其哈希桶.memsetmemset

它似乎google::dense_hash_map针对大小进行了优化,因此在运行示例时不需要初始化尽可能多的内存.

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