直接使用函数参数与创建局部变量

时间:2013-06-13 16:11:07

标签: c++ optimization execution-time

考虑函数的这两个实现:

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;
}

这些功能的执行时间是否有明显的差异(如果有的话)?这些局部变量赋值是否会引入计算开销,或者编译器处理无用的局部变量?

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

1 个答案:

答案 0 :(得分:2)

如果没有真正建立一个这样做的系统,我会认为没有任何区别。并且sin往往需要花费相当长的时间,因此使用局部变量等进行的任何微小优化都可能非常有限。

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

但就像我说的那样,如果没有实际尝试这两种方法,那就很难确定[并且我也会删除对sin的调用,因为这可能会“隐藏”这两种变体之间的任何微小差异 - 只需添加6个双倍值即可获得更好的解决方案]。

如果表现(特别是这个功能)很重要,那么就产生一个基准。但是,在开始“弄乱”函数之前,请确保您知道代码中大部分时间消耗的函数。当整个执行时间为几个小时(数十亿次循环)时,在运行几十次的函数中削减两个时钟周期并不是很重要。