-2

什么更有效率?为什么?

选项1:

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

选项 2:

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

提前感谢您的回复!

4

7 回答 7

6

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

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

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

于 2013-04-22T00:05:25.830 回答
5

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

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

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

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

这实际上与第一个版本相同,只是像第二个版本更简洁一些。

于 2013-04-22T00:05:12.713 回答
2

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

选项 2 不能被优化,除非编译器可以看到它的主体someFunction()并且可以确定它总是返回相同的值,而不管...do something...代码中发生了什么。

于 2013-04-22T00:05:09.067 回答
0

第一个是有效的,因为它比较 i 和一个常数来评估 for 循环条件,但是第二个 for 循环每次迭代都会评估 someFunction() 。

于 2013-04-22T00:45:47.267 回答
0

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

于 2013-04-22T00:05:02.970 回答
0

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

于 2013-04-22T00:05:43.260 回答
0

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

其次,选项 2 肯定更昂贵,并且可能完全错误,因为您someFunction()重复调用,而不是调用一次并使用返回值来限制。

于 2013-04-22T00:06:37.453 回答