什么更有效率?

时间:2013-04-22 00:02:35

标签: c function

效率更高?为什么呢?

选项1:

int n = someFunction();
for (int i = 0; i < n ; i++)
    //do something...

选项2:

for (int i = 0; i < (someFunction()); i++)
    //do something...

提前感谢您的回复!

7 个答案:

答案 0 :(得分:6)

这两个循环甚至不等同:如果someFunction()在多次调用时预期会返回不同的值,结果会有所不同。

someFunction()返回相同的值时,无论您调用多少次,当someFunction()返回大于或等于1的数字时,第一个选项会更有效率。如果它返回0,则没有区别。

时间差异来自于第二个选项在循环中重复调用someFunction()以获得限制。即使函数调用非常快,此代码也是次优的

答案 1 :(得分:5)

前者总是至少和后者一样有效。对于前者,您只评估someFunction一次。对于后者,你在每次迭代时都会调用它。

智能编译器可能能够在后一种情况下内联someFunction的主体,并意识到它可能是一个常量,使其实际上相等,但第一个永远不会慢。

有时我会做这样的事情,借用JavaScript的约定:

for(size_t i = 0, l = someFunction(); i < l; i++) {
    // ...
}

这与第一个版本实际上是相同的,除了比第二个更简洁。

答案 2 :(得分:2)

对于SomeFunction()在第一次调用时返回大于零的值的一般情况,选项1对someFunction()的调用次数减少。因此,它会更有效率。

除非编译器能够看到someFunction()的主体,否则无法优化选项2,并且可以确定无论...do something...代码中发生什么,它都将始终返回相同的值。

答案 3 :(得分:0)

第一个更高效,因为它只检查someFunction一次。在第二个中,对于每个循环,它一遍又一遍地检查someFunction()

答案 4 :(得分:0)

如果someFunction()的输出不随时间变化,则选项1更有效。

答案 5 :(得分:0)

首先,选项1的语法错误,for循环缺少正确的括号。所以这不会编译。

第二,选项2肯定更贵,而且可能完全错误,因为你反复调用someFunction(),而不是一次调用它并使用返回的值来限制。{/ p>

答案 6 :(得分:0)

第一个是高效的,因为它与一个常数进行比较以评估for循环条件,但是第二个for循环在每次迭代时评估someFunction()。