【发布时间】:2011-02-16 14:42:38
【问题描述】:
假设我有一个如下所示的循环:
for(int i = 0; i < 10000; i++) {
/* Do something computationally expensive */
if (i < 200 && !(i%20)) {
/* Do something else */
}
}
其中一些琐碎的任务被卡在只运行几次的 if 语句后面。 我一直听说“循环中的 if 语句很慢!”因此,为了(略微)提高性能,我将循环拆分为:
for(int i = 0; i < 200; i++) {
/* Do something computationally expensive */
if (!(i%20)) {
/* Do something else */
}
}
for(int i = 200; i < 10000; i++) {
/* Do something computationally expensive */
}
gcc(带有适当的标志,如 -O3)会自动将一个循环分成两个,还是只是展开以减少迭代次数?
【问题讨论】:
-
我当然记得 GCC 邮件列表中对此的讨论——至少有一些支持。通过检查汇编程序输出或
-da,它是否真的会在您的情况下执行它可能最容易验证;它可能只是展开了 0 案例或最大循环案例,我不记得了。但是,在您的情况下(对于 200-10000,它将是:测试 i -
你可以通过检查每个迭代器的 i 的 lsb 来优化(和混淆)代码,因为奇数不能被 20 整除。如果 i
-
您总是听说过“如果循环中的语句很慢”吗?你是从哪里听来的?只是好奇。
标签: c optimization gcc unroll