循环比较(优化)
Comparison in loop (optimization)
让我们考虑一下情况:
bool b = checking_some_condition();
for (int i = 0; i < 1000000; ++i)
{
if (b)
do_something(i);
else
do_something_else(i);
}
编译器将上面的代码优化成这样的东西很明显吗?
if (b)
{
for (int i = 0; i < 1000000; ++i)
do_something(i);
}
else
{
for (int i = 0; i < 1000000; ++i)
do_something_else(i);
}
当然,我只是举例说明目前的情况。我知道检查 bool 值 1000000 次对于性能几乎不明显,但如果我对循环内代码的多种方式进行更复杂的比较,性能的变化可能会很大。特别是如果此代码位于多次调用的函数中。
正如上面的评论中提到的,你不能真正安全地假设编译器会优化什么或不会优化什么。做或不做这些事情是他们的"自由"。
如果你想了解正在发生的事情,最好的方法是查看生成的程序集,这将为你提供客观的方式来争论编译器可能做了什么。 https://godbolt.org/z/W-5Hve 显示了您在上面发布的简单示例。
但是,请尝试使 godbolt 中的示例尽可能逼真,然后检查程序集。即使两个片段将在 godbolt 中产生相同的程序集,以确保这也会发生在您的代码库中,您还需要检查代码库中编译的实现的程序集。
总结一下,我通常做的是:
- 在 godbolt 中尝试一个现实的例子,并使用不同的编译器/标志并更改代码,直到我认为我知道发生了什么。
- 编译我的项目并查看那里的程序集,以尝试再次找到特定函数,以确保我的代码库中的结果相同。
作为额外的一点:objdump -M intel -dC executable
将向您展示可执行文件的程序集。
相关文章:
- gcc 是否在 2 条短裤的过度对齐结构的比较中错过了优化机会?
- 循环比较(优化)
- ARM NEON aarch64:如何以优化的方式比较和更新 neon 寄存器
- 哪个版本(调试/发行 - 未取代/优化)更好地研究C 与组件进行比较
- 为什么这个简短的比较没有优化我预期的方式?
- 符合要求的编译器应该能够优化哪些指针比较以"always false"?
- 短(ASCII,每个字符 7 位)字符串存储和C++中的比较优化
- 启用优化时的堆栈指针比较异常
- 编译器可以优化不必要的比较吗?
- C++按字符串调用函数,比较PHP的性能,如何在C++中优化代码
- char*与上一条指令中设置的值的比较未优化
- C 优化用于字符串比较和替换
- 对于这种自定义MD5比较,可以进行哪些优化
- if条件下两个字符串比较的优化代码
- 优化:昂贵的分支vs廉价的比较
- 优化与零的简单比较以提高性能
- 微优化c++比较函数
- vc++的优化打破了与NaN的比较
- 比较优化的构建与切换情况和多态性
- 如何使c++编译器使用无符号到有符号的技巧来优化比较