C++ “扩大倍数”;如果;相同条件下的s会导致性能提高

C++ “扩大倍数”;如果;相同条件下的s会导致性能提高,c++,optimization,branch-prediction,C++,Optimization,Branch Prediction,假设我有 void f(const bool condition) { if (condition) { f2(); else { f3(); } f4(); if (condition) { f5(); } else { f6(); } } 由于条件从未改变,因此可以将上述情况简化为以下内容 void f(const bool condition) { if (condition) { f2(); f4();

假设我有

void f(const bool condition) {
  if (condition) {
    f2();
  else {
    f3();
  }

  f4();

  if (condition) {
    f5();
  } else {
    f6();
  }
}
由于
条件
从未改变,因此可以将上述情况简化为以下内容

void f(const bool condition) {
  if (condition) {
    f2();
    f4();
    f5();
  } else {
    f3();
    f4();
    f5();
  }
}
请注意,
f4()
在第二个代码中重复,但第二个代码部分的
分支较少。我试图分析这两个代码片段,但在我看来,性能几乎相同。想象一下,在现实生活中,在相同的条件下,上述代码片段可以有更多的
if
。所以我想知道现代x86/64处理器:

  • 如果有两个巨型
    if
    语句,而不是基于相同条件的许多小语句,是否会提高性能
  • const
    关键字是否有助于编译器/处理器生成更好的分支预测
    首先,要注意任何差异,您需要多次运行代码段,如:

    for (int i=0; i<100000000; ++i)
        f(true);
    

    for(int i=0;i首先,要注意任何差异,您需要多次运行代码片段,如:

    for (int i=0; i<100000000; ++i)
        f(true);
    

    for(inti=0;i理论上,消除任何条件操作都可以提高性能。但在现实世界中,根本没有什么区别。
    在您的特定情况下,编译器可以轻松地为您执行建议的优化,因此应该没有区别,正如您已经测试过的那样。优化编译器的重要工作之一是分支消除。它们寻找避免不必要分支的可能性

    那么,你的问题1的答案是: 在大多数情况下,在现代编译器上没有区别

    关于
    const
    关键字:
    const
    本身对分支预测没有帮助。编译器可以查看是否有任何变量未被修改,并尽其所能生成快速代码。当处理器执行二进制代码时,没有任何迹象表明该值是常量。至少在x86和x86-64处理器上是如此


    在任何情况下,“过早优化是万恶之源”(c)Donald Knuth。除非您有显示瓶颈的分析数据,否则您需要避免任何低级优化。为此,您需要一个基准来分析性能。

    理论上,消除任何条件操作都可以提高性能。但在现实世界中,根本没有任何区别。 在您的特定情况下,编译器可以轻松地为您执行建议的优化,因此应该没有区别,正如您已经测试过的那样。优化编译器的重要工作之一是分支消除。它们寻找避免不必要分支的可能性

    那么,你的问题1的答案是: 在大多数情况下,在现代编译器上没有区别

    关于
    const
    关键字:
    const
    本身对分支预测没有帮助。编译器可以查看是否有任何变量未被修改,并尽其所能生成快速代码。当处理器执行二进制代码时,没有任何迹象表明该值是常量。至少在x86和x86-64处理器上是如此


    在任何情况下,“过早优化是万恶之源”(c)Donald Knuth。除非您有显示瓶颈的分析数据,否则您需要避免任何低级优化。为此,您需要一个基准来分析性能。

    首先,您的示例非常简单,任何一个像样的编译器都可以为这两种情况生成

    为了充分混淆它,您应该做一些更复杂的事情,而不是简单地调用
    f4
    ,:


    条件
    常量-编译器必须假定它可以被
    f4
    更改,因此代码片段在语义上不再等效。

    首先,您的示例非常简单,任何一个像样的编译器都可以为这两种情况生成

    为了充分混淆它,您应该做一些更复杂的事情,而不是简单地调用
    f4
    ,:


    条件
    常量-编译器必须假设它可以被
    f4
    更改,因此代码片段在语义上不再等效。

    第一个条件看起来更好,如果需要更改
    f4()
    您只需执行一次,而不是两次,这可能会导致错误。我首先编写程序以确保可读性和可维护性。在分析之后,我确定代码是一个瓶颈,然后再考虑执行此类优化。“const关键字是否有助于编译器/处理器生成更好的分支预测?”可能是最好的答案,这取决于您的编译器。在具有多GHz处理器的台式计算机上,单个if语句花费的时间非常少。优化编译器也可能会发现条件没有改变,并为您进行转换。您最好将时间花在其他地方e、 只有当程序速度不够快时才需要。真正的问题是-你真的需要它吗?可能不需要,那么谁在乎呢?你是说第二个代码片段的else块中的
    f6
    ?第一个看起来更好吗?如果你需要更改
    f4()
    您只需执行一次,而不是两次,这可能会导致错误。我首先编写程序以确保可读性和可维护性。在分析之后,我确定代码是一个瓶颈,然后再考虑执行此类优化。“const关键字是否有助于编译器/处理器生成更好的分支预测?”可能是最好的答案,这取决于您的编译器。在具有多GHz处理器的台式计算机上,单个if语句花费的时间非常少。优化编译器也可能会发现条件没有改变,并为您进行转换。您最好将时间花在其他地方e、 只有当程序不够快的时候才可以。真正的问题是-你真的需要它吗?可能不需要,那么谁在乎呢?你是说
    void f(const bool& condition){