【发布时间】:2018-10-06 21:12:37
【问题描述】:
我正在使用信号处理库从硬件设备收集 16384 个双精度值。我收到的 16384 个值是低通滤波器的输出。我想将样本降低 10 倍。换句话说,我想在每 10 分中保留 1 分。所以通常它的工作原理是这样的:
当低通滤波器完成时,我从我的库中获得一个缓冲区。
然后我收集其中的 10 个缓冲区。
当所有 10 个缓冲区都收集到一个具有 10*16384 双倍的缓冲区中时,我会从缓冲区中循环收集每 10 个双倍。结果是一个缓冲区有 16384 个双精度数。这将用于其余的数据处理。
代码如下:
double[] rawData = new double[163840];
int bufferCount = 0;
private void genericReal2_ProcessData(object Sender, Mitov.SignalLab.ProcessRealNotifyArgs Args)
{
var realbuffer = Args.InBuffer; //get the buffer of processed doubles
var myData = realbuffer.ToArray(); //must be converted to an array since the data type is not quite an array of doubles.
Array.Copy(myData, 0, rawData, bufferCount * 16384, 16384);
bufferCount++;
if (bufferCount == 10)
{
bufferCount = 0;
int j = 0;
for (int i = 0; i < 163840; i += 10) //this loop takes 20ms
{
realbuffer[j] = rawData[i];
j++;
}
genericReal2.SendData(realbuffer); //send data off for further processing
}
}
for 循环运行大约需要 20 毫秒,而其他所有循环大约需要 20 微秒。
那么,有没有什么方法可以在不使用 for 循环的情况下提高它的整体性能?
更新************************** 我已经确定循环中的所有处理时间都用于将 realbuffer 分配给 rawData。所以我将其更改如下:
private void genericReal2_ProcessData(object Sender, Mitov.SignalLab.ProcessRealNotifyArgs Args)
{
double[] finalBuffer = new double[16384];
var realbuffer = Args.InBuffer; //get the buffer of processed doubles
var myData = realbuffer.ToArray(); //must be converted to an array since the data type is not quite an array of doubles.
Array.Copy(myData, 0, rawData, bufferCount * 16384, 16384);
bufferCount++;
if (bufferCount == 10)
{
bufferCount = 0;
int j = 0;
for (int i = 0; i < 163840; i += 10)
{
finalBuffer[j] = rawData[i];
j++;
}
var pointer= realbuffer.Read();
//I can get a pointer to the realbuffer.
//It stores 8 bytes for every double value
how can I copy 16384 8 byte values from finalbuffer to realbuffer?
genericReal2.SendData(realbuffer); //send data off for further processing
}
【问题讨论】:
-
Mitov.SignalLab.ProcessRealNotifyArgs.InBuffer[j] =可能很慢。如果它有一些FromArray功能,它可能会更快,但我真的不知道它是否有。无论哪种方式,问题都不在这段代码中。 -
您可以循环单个块而不是一次循环所有块。这将有助于稍微中断处理。或者.. 如果不需要 double 的大小,那么在 32 位环境中更改为浮点数会加快速度。另一种选择可能是 Parallel.For()
标签: c# performance for-loop