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

问题描述 投票:4回答:1

我有一个算法的两个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,为什么它会执行如此多的指令?

c++ performance
1个回答
5
投票

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

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

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


推荐问答