循环比较(优化)

时间:2018-09-01 10:21:29

标签: c++ performance loops optimization conceptual

让我们考虑一下情况:

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);
}

当然,我只是举例说明当前的情况。我知道检查布尔值1000000次对于性能几乎是不明显的,但是如果我使用循环内代码的多种处理方式进行更复杂的比较,则性能变化可能会很大。尤其是如果此代码位于多次调用的函数中。

1 个答案:

答案 0 :(得分:4)

正如上面的评论中所提到的,您不能真正做出编译器将优化或不优化的安全假设。是否做这些事情是他们的“自由”。

如果您想了解正在发生的事情,最好的方法是查看生成的程序集,这将为您提供一种客观的方式来争论编译器可能所做的事情。 https://godbolt.org/z/W-5Hve显示了您在上面发布的简单示例。

但是,请尝试使Godbolt中的示例尽可能真实,然后检查装配。即使两个片段将在Godbolt中产生相同的程序集,以确保这也将在代码库中发生,您也需要在代码库中检查编译的实现的程序集。

总结一下,我通常要做的是:
-在Godbolt中尝试一个现实的示例,并使用不同的编译器/标志,然后更改代码,直到我认为我正在发生什么事情为止。
-编译我的项目,然后查看那里的程序集,尝试再次找到特定功能,以确保代码库中的结果相同。

还有一点点:objdump -M intel -dC executable将向您展示可执行文件的汇编。