繁体   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