什么更有效率?

lar*_*rod -2 c function

什么更有效率?为什么?

选项1:

int n = someFunction();
for (int i = 0; i < n ; i++)
    //do something...
Run Code Online (Sandbox Code Playgroud)

选项2:

for (int i = 0; i < (someFunction()); i++)
    //do something...
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的回复!

das*_*ght 6

这两个循环甚至不相等:如果someFunction()多次调用它时预计会返回不同的值,结果将会有所不同.

当someFunction()不管你有多少次调用返回的值相同,第一个选项将是更有效时,someFunction()返回大于或等于号1.如果它返回0,将没有区别.

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


ick*_*fay 5

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

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

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

for(size_t i = 0, l = someFunction(); i < l; i++) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

  • @Jack:是的,clang/LLVM可以.[这是我的测试用例.](http://pastebin.com/raw.php?i=ar2NvhYN)生成的程序集访问全局变量并仅执行一次除法.然后它通过循环的其余部分使用该计算值. (2认同)