什么更有效率?为什么?
选项1:
int n = someFunction();
for (int i = 0; i < n ; i++)
//do something...
选项 2:
for (int i = 0; i < (someFunction()); i++)
//do something...
提前感谢您的回复!
这两个循环甚至不等价:如果someFunction()
多次调用它时期望返回不同的值,结果会有所不同。
当someFunction()
无论调用多少次都返回相同的值时,第一个选项在someFunction()
返回大于或等于的数字时会更有效1
。如果它返回0
,则没有区别。
时间上的差异来自第二个选项someFunction()
在循环中重复调用以获得限制的事实。即使函数调用非常快,这段代码也是次优的
前者总是至少和后者一样有效。对于前者,您只需评估someFunction
一次。对于后者,您在每次迭代时都调用它。
在后一种情况下,一个聪明的编译器可能能够内联 的主体someFunction
并意识到它可能是一个常量,使其有效地相等,但第一个永远不会变慢。
有时我会做这样的事情,借用 JavaScript 的约定:
for(size_t i = 0, l = someFunction(); i < l; i++) {
// ...
}
这实际上与第一个版本相同,只是像第二个版本更简洁一些。
对于第一次调用时返回大于零的值SomeFunction()
的一般情况,选项 1 的调用次数较少。someFunction()
因此,它会更有效率。
选项 2 不能被优化,除非编译器可以看到它的主体someFunction()
并且可以确定它总是返回相同的值,而不管...do something...
代码中发生了什么。
第一个是有效的,因为它比较 i 和一个常数来评估 for 循环条件,但是第二个 for 循环每次迭代都会评估 someFunction() 。
第一个效率更高,因为它只检查 someFunction 一次。在第二个中,对于每个循环,它一遍又一遍地检查 someFunction()
如果 的输出someFunction()
不随时间变化,则选项 1 更有效。
首先,选项 1 的语法错误,for
循环缺少右括号。所以不会编译。
其次,选项 2 肯定更昂贵,并且可能完全错误,因为您someFunction()
重复调用,而不是调用一次并使用返回值来限制。