考虑函数的这两个实现:
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()
的选择完全是任意的。我的问题集中在局部变量上,而不是内部发生的操作。
答案 0 :(得分:2)
如果没有真正建立一个这样做的系统,我会认为没有任何区别。并且sin
往往需要花费相当长的时间,因此使用局部变量等进行的任何微小优化都可能非常有限。
我希望大多数“好”编译器(gcc,Microsoft等)能够优化任何未广泛使用的局部变量,并生成完全相同的代码。
但就像我说的那样,如果没有实际尝试这两种方法,那就很难确定[并且我也会删除对sin
的调用,因为这可能会“隐藏”这两种变体之间的任何微小差异 - 只需添加6个双倍值即可获得更好的解决方案]。
如果表现(特别是这个功能)很重要,那么就产生一个基准。但是,在开始“弄乱”函数之前,请确保您知道代码中大部分时间消耗的函数。当整个执行时间为几个小时(数十亿次循环)时,在运行几十次的函数中削减两个时钟周期并不是很重要。