2014-12-07 84 views
1

我必須在性能敏感的地方比較相等的16字節內存塊。更快的內存比較相等16個字節塊比memcmp

塊總是完全對齊,它們總是正好是16個字節。在我看來,我應該能夠利用這些知識,並提出比逐字節比較更好的方法。

事實上,我認爲絕大多數memcmp實現都是這樣做的,但顯然這需要一段時間來分析地址和大小。在我的情況不是這樣,但它仍然較快的是:

... 
mov $0x10,%ecx 
mov -0x4c(%ebp),%esi 
repz cmpsb %es:(%edi),%ds:(%esi) 

我試圖實現32位優化它會檢查我的自我,但它不會有更好的表現。可能是因爲memcmp利用處理器指令,我的自定義C++代碼沒有。

對於這種情況,任何想法是否有更快的memcmp?

+1

看看你的編譯器生成了什麼。 SSE4.2有一個比較16字節字符串的指令。 – Mysticial 2014-12-07 04:55:58

+0

比較找什麼? (差異,位差,否定?) – iamgopal 2014-12-07 04:56:23

+1

許多編譯器都會內聯memcmp。如果size參數是一個常量,那麼編譯器可能會很聰明。 – 2014-12-07 04:58:30

回答

0

你可以嘗試這樣的事情,只是爲了看看它會做出什麼區別與memcmp比較(假設你有一個64位處理器):

#define MY_CMP(B1, B2) (((int64_t *) (B1))[0] == (int64_t *) (B2))[0] && ((int64_t *) (B1))[1] == ((int64_t *) (B2))[1]) 

if (MY_CMP(array1, array2)) { 
    // something 
} 

但如果comilator好,你不應該看到有什麼不同。

+0

大多數平臺,甚至64位的,定義'int'爲32bit – sp2danny 2014-12-07 05:15:51

+0

@ sp2danny取點 – Dmitry 2014-12-07 05:20:08

+0

這是一個最快的定製版本,但仍然不如memcmp – gsf 2014-12-07 05:27:12