什么是复制数组的最快方法?

5

我正在处理一些Wave文件,将其从磁盘读入一个字节数组中。我希望能够快速地将该字节数组的部分内容复制到另一个缓冲区进行中间处理。目前我使用的类似以下的方法:

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

我认为这是一种缓慢的方法,因为在for循环条件和增量中进行的计算与实际操作中进行的计算一样多。如果C#中有块复制可用或者其他实现块复制的方式,那就太好了。
也许这并不太慢,但它看起来需要大量的工作来移动一些数据。这里的“size”在2^10到2^14之间。然后我将“fin”交给FFT库处理,因此这绝不是代码中最慢的部分,也许我走错了路。
编辑更新: 我意识到微小的优化不是一个人应该花费时间的地方,我知道性能分析是实现整体加速的更好方式,但我知道这段代码在“热路径”中,并且必须在各种终端用户架构下在不到三分之一秒内完成,以最小化我们的硬件系统需求。即使我知道以下FFT代码将耗费更多时间,我仍在寻找可以提高速度的地方。
Array.Copy看起来很不错,我以前不知道这个,我认为这个Q&A已经成功了!
4个回答

13

还有另外一个选项:

Array.Copy
Array.CopyTo

但是是否更快需要进行性能分析。

但请注意不要过于关注微小的优化,而错失了大局,在现代计算机上,多级内存缓存的效果可能比复制方案本身更重要。

编辑:在反编译器中进行快速检查:上述两种方法都归结为一个通用的本地实现(很好)。

请注意,Array.Copy文档涵盖有效的类型转换,类似于值->值扩展转换,如将byte转换为float应该没问题。


3

看看 Array.Copy,它应该更快。


3

由于您正在从字节转换为浮点数,因此不会获得任何显着的加速。没有Array.Copy或memcopy的变体可以处理它。

唯一可能的收益是将字节值“poke”到浮点数中。我对浮点数的实现了解不够,不知道它是否有效,而且我也不想知道。


是的,在MS.NET Framework下,我认为我们不应该在浮点数下面戳位 :) - Karl

1
我不会引用 Knuth,但会对你的代码进行分析。在代码中添加一些时间戳并测量每个部分所需时间。这样,你就可以把时间花费在优化上了 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接