假设您已经选择了最有效的算法来解决性能是第一优先的问题,而现在您正在实现它,那么您必须决定如下所示的细节:
v[i*3+0],v[i*3+1]和v[i*3+2]包含了粒子i的速度分量,我们要计算出总动能。考虑到所有粒子的质量都一样,人们可以写:
inline double sqr(double x)
{
    return x*x;
}
double get_kinetic_energy(double v[], int n)
{
    double sum = 0.0;
    for (int i=0; i < n; i++)
        sum += sqr(v[i*3+0]) + sqr(v[i*3+1]) + sqr(v[i*3+2]);
    return 0.5 * mass * sum;
}为了减少乘法次数,它可以写成:
double get_kinetic_energy(double v[], int n)
{
    double sum = 0.0;
    for (int i=0; i < n; i++)
    {
        double *w = v + i*3;
        sum += sqr(w[0]) + sqr(w[1]) + sqr(w[2]);
    }
    return 0.5 * mass * sum;
}(人们可以用更少的乘法来编写函数,但这不是问题的重点)
现在我的问题是:既然许多C编译器可以自动进行这种优化,那么开发人员应该在哪里依赖编译器,她/他应该在哪里尝试手动进行一些优化呢?
发布于 2022-02-16 16:13:11
开发人员应该在哪里依赖编译器,她/他应该在哪里尝试手动进行一些优化?
当我发现这个瓶颈时,
从那时起,你就可以开始研究系统特定的东西,以及算法本身--有太多的事情要看,无法用这样的答案来回答。优化低端微控制器的代码和64位的桌面PC (以及两者之间的一切)是一个巨大的区别。
https://stackoverflow.com/questions/71144522
复制相似问题