c# - .NET 中计算数组平均值的算法的性能问题

标签 c# algorithm performance

以下代码创建了一个平均包含 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/

相关文章:

c# - 在 Moq 中,给定对 .Object 的引用,是否可以操纵原始模拟?

C# 异步套接字 : Send data base64 coded?

algorithm - 图像识别的良好神经网络拓扑和训练方法

检查矩阵中单元值的邻居

MySQL时间戳自动更新性能

sql-server - 加速 MS SQL 服务器的最佳方法

c# - 无法对 SQL Server Express 2008 使用 SQL Server 身份验证

c# - 在 C# 中使用结构调用 C 函数 - 我做错了什么?

algorithm - 发布-订阅系统的设计/代码调度程序

java - 对可能包含数字的字符串进行排序