Kar*_*arl 4 c# arrays optimization loops
我正在做一些Wave文件处理,让它们从磁盘读取到一个字节数组.我想快速将部分从这个字节数组复制到另一个缓冲区进行中间处理.目前我使用这样的东西:
float[] fin;
byte[] buf;
//fill buf code omitted
for(int i=offset; i < size; i++){
fin[i-offset] = (float) buf[i];
}
Run Code Online (Sandbox Code Playgroud)
我觉得这是一个缓慢的方法,因为在for循环条件和增量中有尽可能多的计算在实际正文中有结束.如果在C#中有可用的块复制或其他方式我可以实现块复制,那将是很好的.
也许它不是太慢,但确定移动一些数据看起来确实很多.这里"大小"介于2 ^ 10和2 ^ 14之间.然后我将"fin"关闭到FFT库,所以这绝不是代码中最慢的部分,也许我正在咆哮错误的树.
编辑更新:我意识到微优化不是别人应该花时间的地方,我意识到分析是一种更好的方式来实现整体加速,但我知道这个代码是在一个"热门路径",必须在下面完成三分之一秒的不同终端用户体系结构,以最大限度地减少我们的硬件系统要求.即使我知道以下FFT代码会耗费更多时间,但我正在寻找能够获得它们的加速.
Array.Copy肯定看起来不错,之前我不知道,我认为这个Q&A已经成功了!
Ric*_*ard 12
还有:
Array.Copy
Array.CopyTo
Run Code Online (Sandbox Code Playgroud)
但这些是否更快将需要分析.
但是要注意关注微观优化到你错过大局的程度,在现代PC上,多级内存缓存的效果可能比复制中的一种或另一种方法更大.
编辑:快速检查反射器:上述两种方法归结为一个常见的本机实现(好).
注意Array.Copy的文档覆盖有效类型转换,值 - >值扩展转换,如byte to float应该没问题.