2009-02-19 119 views
4

我正在做一些Wave文件處理,並讓它們從磁盤讀取到一個字節數組中。我想快速從這個字節數組複製部分到另一個緩衝區中進行中間處理。目前我使用這樣的事:什麼是複製我的陣列的最快方法?

float[] fin; 
byte[] buf; 
//fill buf code omitted 
for(int i=offset; i < size; i++){ 
    fin[i-offset] = (float) buf[i]; 
} 

我覺得這是一個緩慢的方法,因爲有儘可能多的計算在持續了循環條件和增量,因爲超過在實際的身體。如果在C#中有可用的塊拷貝或者其他方式可以實現塊拷貝,那就太好了。

也許它不是太慢,但它確實看起來像移動一些數據很多工作。這裏的「大小」在2^10和2^14之間。然後我將「fin」移交給FFT庫,所以這絕不是代碼中最慢的部分,也許我正在吠叫錯誤的樹。我認識到微型優化並不是人們應該花費時間的地方,而且我認識到分析是一種更好的方式來實現整體加速,但是我知道這段代碼處於「熱門路徑」,並且必須在不同的最終用戶架構下在不到三分之一秒的時間內完成,以最大限度地減少我們的硬件系統要求。即使我知道下面的FFT代碼會花費更多的時間,但我正在尋找可以獲得它們的加速。

Array.Copy肯定看起來不錯,我以前不知道,我認爲這個Q &已經成功了!

回答

12

還有:

Array.Copy 
Array.CopyTo 

但這些是否會更快,需要分析。

但是要警惕關於關注微觀優化以至於忽略大局,在現代PC上,多級內存緩存的效果可能會大於副本的一種或另一種方法。

編輯:快速檢查反射器:上述兩種方法歸結爲常見的本地實現(好)。

請注意Array.Copy的文檔涵蓋了有效的類型轉換,值 - >值擴展轉換(如字節到浮點)應該沒問題。

1

我不會引用knuth,但會剖析您的代碼。放入一些時間戳並衡量事情發生的時間。然後,你可以花時間在優化以及:)

3

看一看Array.Copy應該更快

3

因爲你是從字節轉換爲浮動你不會得到任何顯著加速。沒有Array.Copy或memcopy的變種可以解決這個問題。

唯一可能的增益是將字節值「戳」到浮點數中。我不知道(關於float的實現)是否足夠了解它是否會起作用,而且我也不想知道。

+0

是的在MS.NET框架下,我不認爲我們應該戳一下浮動:) – Karl 2009-02-20 00:11:18

相關問題