循环比较(优化)
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 次对于性能来说几乎不明显,但是如果我对循环内代码的多种运行方式进行更复杂的比较,性能的变化可能会很显着。特别是如果此代码位于多次调用的函数中。
正如上面的评论中所提到的,您无法真正安全地假设编译器将优化或不会优化什么。这些事情做不做是他们"freedom"
如果您想了解正在发生的事情,最好的方法是查看生成的程序集,这将为您提供 objective 争论编译器可能做了什么的方式。 https://godbolt.org/z/W-5Hve 显示您在上面发布的简单示例。
但是,请尽量使godbolt中的示例尽可能真实,然后检查程序集。即使两个片段会在 Godbolt 中产生相同的程序集以确保这也会在您的代码库中发生,您也需要检查代码库中已编译实现的程序集。
总结一下,我通常做的是:
- 在 Godbolt 中尝试一个真实的例子并尝试不同的 compilers/flags 并更改代码直到我认为我知道发生了什么。
- 编译我的项目并查看那里的程序集,尝试再次找到特定函数,以确保我的代码库中的结果是相同的。
作为额外的一点:objdump -M intel -dC executable
将向您展示可执行文件的汇编。
让我们考虑一下情况:
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 次对于性能来说几乎不明显,但是如果我对循环内代码的多种运行方式进行更复杂的比较,性能的变化可能会很显着。特别是如果此代码位于多次调用的函数中。
正如上面的评论中所提到的,您无法真正安全地假设编译器将优化或不会优化什么。这些事情做不做是他们"freedom"
如果您想了解正在发生的事情,最好的方法是查看生成的程序集,这将为您提供 objective 争论编译器可能做了什么的方式。 https://godbolt.org/z/W-5Hve 显示您在上面发布的简单示例。
但是,请尽量使godbolt中的示例尽可能真实,然后检查程序集。即使两个片段会在 Godbolt 中产生相同的程序集以确保这也会在您的代码库中发生,您也需要检查代码库中已编译实现的程序集。
总结一下,我通常做的是:
- 在 Godbolt 中尝试一个真实的例子并尝试不同的 compilers/flags 并更改代码直到我认为我知道发生了什么。
- 编译我的项目并查看那里的程序集,尝试再次找到特定函数,以确保我的代码库中的结果是相同的。
作为额外的一点:objdump -M intel -dC executable
将向您展示可执行文件的汇编。