【发布时间】:2021-04-14 16:55:40
【问题描述】:
也许是一个愚蠢的问题,但我想知道循环内部或外部的循环计数器(int i = 0 或 size_t i = 0)的声明是否会影响循环的性能。例如:
// Declaration of counter out of the loop:
int i = 0;
for(i = 0; i < iters; i++) {
// do something
}
// Declaration of counter inside of the loop:
for(int i = 0; i < iters; i++) {
// do something
}
我知道编译器在这两种情况下只在内部创建一次计数器变量,因此,没有任何区别......对吗?
【问题讨论】:
-
您的编译器有一个选项可以生成已编译代码的汇编列表。您是否尝试过编译这两个版本,然后查看编译器生成的代码是否相同或不同?
-
不,我没有检查两个版本中生成的汇编代码......好点。我将自己检查并发布痕迹。我正在使用类似于 C99 的 OpenCL,所以我想这将类似于 C 和 OpenCL 的痕迹
-
非常方便的工具,可以快速查看不同编译器和编译器选项如何转换代码:godbolt.org
-
也不要误以为更短的代码就是更快的代码。通常它是,但看起来非常简单,短代码可以做 CPU 讨厌做的事情,比如用糟糕的内存访问模式滥用缓存,并且最终花费的时间比长时间执行相同工作的程序要长得多大大地。只有在证明简单太慢之后,才能追求简单并担心快速。
-
一个非常重要的考虑因素是变量的“范围”。目标是最小化“范围” 一种方法是:
for(int i = 0; i < iters; i++) {另一种方式,如您的示例代码所示,导致变量的“范围”是变量声明之后的所有文件。
标签: c++ c performance loops