【发布时间】:2016-01-23 08:54:07
【问题描述】:
以下代码创建一个平均数组,包含 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);
}
迭代平均的原因是为了避免200,000个数组的值求和时溢出。
在现实世界中,200,000 个数组是使用 FFTW 库在 250 毫秒内生成的 DFT。我有点惊讶的是,在我的系统上计算平均数组大约需要 500-600 毫秒(平均),即迭代和几次 flops 需要的时间是 FFT 的 2-3 倍。
有没有办法在 .NET 中使用不同(更快)的方式来加快速度或达到相同的结果,还是我必须切换语言以提高速度?
【问题讨论】:
-
您可以将我键入的循环计数器声明为双精度。每次我们在内部执行操作 .NET 时都会进行类型转换。我们可以节省此操作的成本。
-
不确定,但试试 Parallel.For 看看是否有帮助。
-
如果你去掉 TickCount,它会快一倍。
-
除法非常慢,比加法慢 10-30 倍。也许您可以对 10 个数字的批次使用快速平均,而对这些批次仅使用较慢的迭代平均公式。
标签: c# algorithm performance