2017-04-16 168 views
3

我有一個算法的兩個C++實現,稱它們爲ABAB之間唯一的區別是A使用std::unordered_map<int, int> hashmap;,但B使用google::dense_hash_map<int, int> hashmap;什麼是__memset_sse2,它爲什麼執行如此多的指令?

我發現一個輸入,其中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以及它爲什麼執行如此多的指令?

+0

'__memset_sse2'只是SSE2優化的[memset]版本(http://en.cppreference.com/w/cpp/string/byte/memset)。嘗試使用'-g'運行'perf'並檢查輸出中的調用圖 – myaut

回答

4

__memset_sse2用於implementationsmemset功能針對支持SSE2的體系結構進行了優化。當你看到它佔用了大約三分之二的執行時間時,這意味着大部分時間都用來初始化一個內存塊,它有一個相對較大的大小。散列表很可能使用memset來初始化其散列桶。

看起來google::dense_hash_map針對大小進行了優化,因此在運行示例時不需要初始化更多的內存。

注意:觀察到初始化佔用CPU時間的三分之二可能意味着您的基準測試的設計不正確。也許您通過哈希容器放入的數據量相對較少,或者您在每次運行時都要重新構建容器。