考虑函数的以下两种实现:

double MyFoo::foo(std::vector<double> & v){
    double f1 = v.at(1);
    double f2 = v.at(2);
    double f3 = v.at(3);
    double f4 = v.at(4);
    double f5 = v.at(5);
    double f6 = v.at(6);

    double ret = sin(f1)+ sin(f2)+ sin(f3)+ sin(f4)+ sin(f5)+ sin(f6)+ sin(f7);
    return ret;
}


double MyFoo::foo(std::vector<double> & v){
    double ret = sin(v.at(1))+ sin(v.at(2))+ sin(v.at(3))+ sin(v.at(4))+ sin(v.at(5))+ sin(v.at(6))+ sin(v.at(7));
    return ret;
}

这些功能的执行时间是否有明显的不同(如果有)?这些局部变量分配会带来计算开销还是编译器会处理无用的局部变量?

附言sin()的选择完全是任意的。我的问题集中在局部变量,而不是内部发生的操作。

最佳答案

如果没有实际构建执行此操作的系统,我会猜测根本没有区别。无论如何,sin往往会花费一些时间,因此,使用局部变量等进行的任何次要优化可能都非常微不足道。

我希望大多数“好的”编译器(gcc,Microsoft等)都可以优化未广泛使用的任何局部变量,并产生完全相同的代码。

但是就像我说的那样,实际上并没有尝试这两种方法,很难这样说[[我也将删除对sin的调用,因为这可能会“隐藏”这两个变体之间的任何细微差别-仅添加6个double值会是一个更好的解决方案]。

如果性能(尤其是此功能)至关重要,则可以制定基准。而且,在开始“处理”函数之前,请确保您了解大部分时间在代码中消耗了哪些函数。在整个执行时间为几个小时(数十亿个周期)的情况下,将一个运行几十次的函数的两个时钟周期缩减为2个时钟点没有什么意义。

关于c++ - 直接使用函数参数与创建局部变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17091947/

10-11 20:54