2017-02-09 49 views
1

我想要最快速地&高效地找出兩個內存緩衝區 - 保持任意定義的值 - 在按位對比中是否相同。memcmp - 是否有更快的方法來按位比較兩個緩衝區

我對什麼都不感興趣,但布爾「是相同的」,我希望方法儘快返回,即找到第一個差異。

達到此目的的最佳方法是什麼? 我currenlty首先比較整體規模 - 這我知道 - 使用 memcmp如果他們是相同的大小

memcmp(buf1_ptr, buf2_ptr, sizeof(buf1)) 

這是最有效的,我可以做的?我應該將比較分成for循環的垃圾嗎?

+2

緩衝區有多大?除非它們非常大,並且你可以從多個線程中獲得一些好處,否則我懷疑你會比'memcmp'做得更好。 – BoBTFish

+0

@BoBTFish:如果緩衝區很大,那麼限制因素很可能是CPU和RAM之間的帶寬 - 我預計單核可能會飽和。 –

+0

@MartinBonner鑑於所提供的最少信息,這超出了我願意推測的範圍。我確實說過*也許*。 – BoBTFish

回答

3

一般而言,memcmp將由專家用匯編語言編寫。在解決它的通用問題時,你不可能比他們做得更好。

如果您可以承諾,指針總是(例如)在16字節邊界上對齊,並且長度將始終爲16字節的倍數,您可以通過使用像SSE這樣的矢量化解決方案。 (在這種情況下,memcmp可能最終也會使用SSE,但它必須首先進行一些測試以確保 - 並且您可以節省這些測試的成本)。

否則 - 只需使用memcmp。

+0

謝謝。有一件事我不確定:對於大型緩衝區,memcmp會在第一次差異時「停止」,還是會一直檢查整個大小?在這種情況下,在for循環中有「減少它」的好處嗎? – BmyGuest

+1

該標準不保證它會停止在第一個區別(因爲標準不傾向於提供這樣的性能保證)。 *在實踐中*,所有的實現將停在第一個區別(或者如果實現者認爲減少分支的數量將會提高整體性能,那麼可能會在第一個區別之後不久)。 –