具有相同索引的for循环的性能

New*_*ech 3 c c++ indexing performance for-loop

在编码时我遇到了一个问题:

当我必须使用大量for循环时,所有迭代都在不同的范围内.如果我只将一个变量声明为索引(示例I)或者它根本不重要(示例II),那么性能(即运行时)会更好吗?

例I:

int ind;
for(ind=0; ind < a; ind++) { /*do something*/ }
for(ind=0; ind < b; ind++) { /*to something*/ }
...
for(ind=0; ind < z; ind++) { /*to something*/ }
Run Code Online (Sandbox Code Playgroud)

例二:

for(int ind=0; ind < a; ind++) { /*do something*/ }
...
for(int ind=0; ind < z; ind++) { /*do something*/ }
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助

Ric*_*ges 6

如果您正在启用优化(如果不这样做,任何关于性能的讨论都没有实际意义)那么就无法推断编译器在这两种情况下会做什么.

答案取决于:

  1. 工具链
  2. 工具链的版本
  3. 工具链的构建选项有哪些
  4. 循环中发生了什么
  5. (相关)是否可以展开循环
  6. (相关)循环是否实际需要索引(如果您只是索引到数组中,所有提及i通常都会被优化掉).
  7. ...等等

以下是编写快速代码的方法:

  1. 写出简洁明了表达您意图的优雅代码.
  2. 检查您的代码是否优雅,并简明扼要地表达您的意图.
  3. 删除错误,然后返回2
  4. 启用优化程序.
  5. (这一点很重要)等待用户抱怨你的代码太慢了.
  6. 如果没有发生5,请停止.
  7. 衡量花费最多时间的地方并解决这个问题.它不会是你的循环计数器,我可以向你保证.

为了记录,你应该这样写:

for(int ind=0; ind < a; ++ind)
Run Code Online (Sandbox Code Playgroud)

因为它更优雅(ind的范围有限),不太可能是bug,使用ind的预增量(如果ind恰好成为类类型则表现更好)并表达intent(ind用于此循环).

  • 我注意到了 - 我们穿过了以太.就个人而言,我更喜欢将循环中的条件表示为"ind <a" - 编译器倾向于不喜欢将类型与值进行比较:-) (2认同)