以下代码创建了一个平均包含 200,000 个数组的数组,每个数组包含 512 个元素。
void Main()
{
double[] avg = new double[512];
int start = System.Environment.TickCount;
for (int i = 0; i < 200000; i++)
{
for (int j = 0; j < avg.Length; j++)
{
// The `i` in `i-avg[j]` is a dummy for the measured variable.
avg[j] = avg[j] + (i - avg[j])/(i + 1);
}
}
Console.WriteLine(System.Environment.TickCount-start);
}
之所以要迭代平均,是为了避免20万个数组求和时溢出。
在现实世界中,200,000 个数组是使用 FFTW 库在 250 毫秒内生成的 DFT。我有点惊讶,在我的系统上计算平均数组大约需要 500-600 毫秒(平均),即迭代和几次触发器比执行 FFT 花费的时间长 2-3 倍。
有没有办法在 .NET 中使用不同(更快)的方式来加速或完成相同的结果,或者我是否必须切换语言以提高速度?
最佳答案
通过将内部循环展开为 512 的除数,您将节省一点时间。此外,我不确定我是否理解 i 循环的用途,因为它代表 (i+1) 可以预先计算并用乘法代替。有没有办法在您的实际案例中应用相同的优化,或者您这样做只是为了提高计时的准确性?
for (double i = 0; i < 200000; i++)
{
var inv_i_plus_1 = 1.0 / (i + 1);
for (int j = 0; j < avg.Length; )
{
// The `i` in `i-avg[j]` is a dummy for the measured variable.
avg[j] = avg[j] + (i - avg[j]) * inv_i_plus_1; j++;
avg[j] = avg[j] + (i - avg[j]) * inv_i_plus_1; j++;
avg[j] = avg[j] + (i - avg[j]) * inv_i_plus_1; j++;
avg[j] = avg[j] + (i - avg[j]) * inv_i_plus_1; j++;
avg[j] = avg[j] + (i - avg[j]) * inv_i_plus_1; j++;
avg[j] = avg[j] + (i - avg[j]) * inv_i_plus_1; j++;
avg[j] = avg[j] + (i - avg[j]) * inv_i_plus_1; j++;
avg[j] = avg[j] + (i - avg[j]) * inv_i_plus_1; j++;
}
}
关于c# - .NET 中计算数组平均值的算法的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34961514/