簡體   English   中英

復制數組的最快方法是什么?

[英]What is the fastest way to copy my array?

我正在做一些Wave文件處理,讓它們從磁盤讀取到一個字節數組。 我想快速將部分從這個字節數組復制到另一個緩沖區進行中間處理。 目前我使用這樣的東西:

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

我覺得這是一個緩慢的方法,因為在for循環條件和增量中有盡可能多的計算在實際正文中有結束。 如果在C#中有可用的塊復制或其他方式我可以實現塊復制,那將是很好的。

也許它不是太慢,但確定移動一些數據看起來確實很多。 這里“大小”介於2 ^ 10和2 ^ 14之間。 然后我將“fin”關閉到FFT庫,所以這絕不是代碼中最慢的部分,也許我正在咆哮錯誤的樹。

編輯更新:我意識到微優化不是別人應該花時間的地方,我意識到分析是一種更好的方法來實現整體加速,但我知道這個代碼是在一個'熱門路徑',必須在下面完成三分之一秒的不同終端用戶體系結構,以最大限度地減少我們的硬件系統要求。 即使我知道以下FFT代碼會耗費更多時間,但我正在尋找能夠獲得它們的加速。

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

還有:

Array.Copy
Array.CopyTo

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

但是要注意關注微觀優化到你錯過大局的程度,在現代PC上,多級內存緩存的效果可能比復制中的一種或另一種方法更大。

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

注意Array.Copy的文檔覆蓋有效類型轉換,值 - >值擴展轉換,如byte to float應該沒問題。

看看Array.Copy它應該更快

由於您要從byte轉換為float,因此您不會獲得任何顯着的加速。 沒有Array.Copy或memcopy的變體可以解決這個問題。

唯一可能的收益是將字節值“戳”到浮點數中。 我不知道(關於float的實現)知道它是否會起作用我真的不想知道。

我不會引用knuth但是會對您的代碼進行分析。 加上一些時間戳並測量事情的持續時間。 然后你可以把時間花在優化上:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM