在编译时知道应该对 for 循环执行多少次迭代有什么好处吗?
例如,在某些情况下,编译器能否生成运行速度更快的可执行文件:
#define ITERATIONS 10
int foo()
{
for (int i=0; i < ITERATIONS; i++){
do_something();
}
}
比给定的:
int foo(int iterations)
{
for (int i=0; i < iterations; i++){
do_something();
}
}
如果这不是普遍情况,那是什么情况?
我关心的是 OpenCL 的特定情况,所以我也想知道这是否与 C 不同。
最佳答案
我使用 GCC 在相当现实的情况下进行了测试。当循环数在编译时已知时,我得到这个:
.L2:
call do_something
subl $1, %ebx
jne .L2
如果不是,我得到这个:
.L6:
call do_something
addl $1, %ebx
cmpl %ebp, %ebx
jne .L6
因此,它能够通过更改为递减计数到零循环而不是递增计数循环来稍微更好地优化固定迭代次数。如果不出意外,这会使用更少的代码缓存。
通过更高的优化级别,它完全展开了一个调用外部函数十次的循环。据推测,除非它认为这样做更好,否则它不会这样做。如果迭代次数未知,它肯定不能这样做。
简短回答:固定的迭代次数为编译器提供了更多选择。至少在某些时候,这应该会产生稍微好一点的代码。
关于c - 在编译时知道 for 循环的迭代次数是否有优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12954157/