2009-02-19 80 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

相关问题