2012-09-03 35 views
0

我想嘗試用多線程比較字節[]通過的PInvoke memcmp結合多線程

有這個代碼,似乎基準..但我想,以檢查是否是最快的我已經到目前爲止結合使用memcmp我可以進一步加快比較過程。

想法我有:

1)通過多線程它。

2)另一種思路,

是在byte[] 的情況下,可以檢查它是否是80%至100%相同的(如果可能的話,在所有..) 給這個選項將它的時間縮短的計算?

的第一個問題是在更高的優先級...如果我必須選擇..

public static bool ByteArrayCompare(byte[] b1, byte[] b2) 
    { 
     return b1.Length == b2.Length && memcmp(b1, b2, b1.Length) == 0; 
    } 
+0

我期望多線程代碼會導致一個較慢的程序。 –

回答

0

你可能會通過多線程來加快速度。只需啓動多個N線程,每個線程將比較陣列的1/N。但是,這隻適用於多核機器。另外請記住,產生新線程並收集其結果會對您的操作造成固定的時間損失,這實際上可能比僅在單個線程上執行更大。還有一件事要考慮,就是你的代碼和最慢的線程一樣慢,所以如果你產生了很多線程,你必須等到你的最後一個線程完成。

當您可以檢測到其中一個線程發現數據不相同時,您可能會獲得更多的靈活性並考慮更爲迂迴的方案。然後該線程可以向主線程發送關於它的信號,並且可以安全地終止其他正在運行的線程。

實際加速取決於您正在比較的數據量有多大(我假設這是相當大的,因爲您正在考慮這一點)。多少次這些數據是相同的還是全部不同的。如果你的數據經常不同,你會得到相當大的加速。

至於你的第二個想法。是的,您可以想出方案,可以讓您更快速地隨機抽樣兩個數組,並且一旦發現至少有一個不同的字節,則可以將兩個數據集聲明爲不同並提早終止。但是,你應該小心如何實現這一點。首先,您應該以塊爲單位進行比較,而不是單個字節。查看硬件體系結構緩存/預取行爲以確定最佳塊大小。另外,如果你知道關於你的數據的一些信息,你應該嘗試對那些更可能不同的區域進行抽樣。通過不進行隨機抽樣,您可能會得到更好的結果,但可以通過以可預測的模式進行抽樣。因此,如果您無法使用隨機抽樣查找差異,則可以比較其餘數據,而無需重新比較已處理的數據。

+0

非常感謝您花時間進行類比,儘管由於我是編程新手,我無法像在文字中描述的那樣實現線程(1/N),不知道如何正確編寫代碼 – LoneXcoder