我正在做一些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&amp; A已经成功了!
答案 0 :(得分:12)
还有:
Array.Copy
Array.CopyTo
但是这些是否更快将需要分析。
但是要警告关注微观优化到你错过大局的程度,在现代PC上,多级内存缓存的效果可能大于一种方法或另一种方法。副本。
编辑:快速检查反射器:上述两种方法归结为一个常见的本机实现(好)。
请注意,Array.Copy的文档涵盖了有效的类型转换,值为&gt;像byte到float这样的值扩展转换应该没问题。
答案 1 :(得分:3)
看看Array.Copy应该更快
答案 2 :(得分:3)
由于您要从byte转换为float,因此您不会获得任何显着的加速。没有Array.Copy或memcopy的变体可以解决这个问题。
唯一可能的增益是将字节值“戳”到浮点数中。我不知道(关于float的实现)知道它是否会起作用我真的不想知道。
答案 3 :(得分:1)
我不会引用knuth,但会对您的代码进行分析。加上一些时间戳并测量事情的持续时间。然后你可以把时间花在优化上:)