我正在处理一些 Wave 文件并将它们从磁盘读入一个字节数组。我想快速将此字节数组中的部分复制到另一个缓冲区以进行中间处理。目前我使用这样的东西:
float[] fin;
byte[] buf;
//fill buf code omitted
for(int i=offset; i < size; i++){
fin[i-offset] = (float) buf[i];
}
我觉得这是一个缓慢的方法,因为在 for 循环条件和增量中进行的计算与实际主体中的计算一样多。如果在 C# 中有可用的 block 复制或我可以实现 block 复制的其他方式,那就太好了。
也许它并不太慢,但移动一些数据看起来确实需要大量工作。这里的“大小”在 2^10 和 2^14 之间。然后我将“fin”交给 FFT 库,所以这绝不是代码中最慢的部分,也许我找错了树。
编辑更新: 我意识到微优化不是人们应该花时间的地方,我意识到分析是实现整体加速的更好方法,但我知道这段代码处于“热路径”中,必须在不到三分之一的时间内完成第二个是关于不同的最终用户架构,以最大限度地减少我们的硬件系统要求。尽管我知道以下 FFT 代码会耗费更多时间,但我正在寻找可以获得加速的地方。
Array.Copy 确实看起来不错,我以前不知道,我认为这个问答已经成功了!
最佳答案
还有:
Array.Copy
Array.CopyTo
但是这些是否会更快需要分析。
但请注意不要只关注微观优化而忽略大局,在现代 PC 上,多级内存缓存的效果可能比一种或另一种方法更大副本。
编辑:快速检查反射器:以上两种方法都归结为一个通用的 native 实现(很好)。
请注意 Array.Copy 的文档涵盖有效类型转换,值 -> 值扩展转换(如字节到 float )应该没问题。
关于c# - 复制阵列的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/567780/