我正在从USB设备收集数据,并且这些数据必须发送到音频输出组件。目前,我没有及时传递数据以避免输出信号中的杂音。所以每一毫秒都很重要。
目前,我正在收集以65536字节的字节数组形式提供的数据。前两个字节以小端格式表示16位数据。这两个字节必须放置在双精度数组的第一个元素中。接下来的两个字节必须放置在不同双精度数组的第一个元素中。然后对65536缓冲区中的所有字节重复此操作,以便您最终得到大小为16384的2个double[]数组。
我目前正在使用如下代码中所示的BitConverter.ToInt16。它需要约0.3毫秒才能运行,但必须执行10次才能获得一个要发送到音频输出的数据包。因此,开销为3毫秒,这足以导致某些数据包最终无法按时传递。 代码
目前,我正在收集以65536字节的字节数组形式提供的数据。前两个字节以小端格式表示16位数据。这两个字节必须放置在双精度数组的第一个元素中。接下来的两个字节必须放置在不同双精度数组的第一个元素中。然后对65536缓冲区中的所有字节重复此操作,以便您最终得到大小为16384的2个double[]数组。
我目前正在使用如下代码中所示的BitConverter.ToInt16。它需要约0.3毫秒才能运行,但必须执行10次才能获得一个要发送到音频输出的数据包。因此,开销为3毫秒,这足以导致某些数据包最终无法按时传递。 代码
byte[] buffer = new byte[65536];
double[] bufferA = new double[16384];
double[] bufferB = new double[16384]
for(int i= 0; i < 65536; i +=4)
{
bufferA[i/4] = BitConverter.ToInt16(buffer, i);
bufferB[i/4] = BitConverter.ToInt16(buffer, i+2);
}
我该如何改进这个?有没有可能使用不安全的代码来复制值?我对此毫无经验。谢谢。
BitConverter.ToInt16
的源代码,然后移除你不需要的所有检查,并将fixed
语句从循环中提取出来。 - Michael Liu