【问题标题】:C++ if statement speed [closed]C++ if 语句速度
【发布时间】:2014-11-20 04:34:20
【问题描述】:

c++ 中什么速度更快?

布尔 b1;

  1. if(b1 == true)if(b1) ?

  2. if(b1 == false)if(!b1) ?

【问题讨论】:

  • 您的基准测试结果如何?大会怎么说?这很容易通过编译、测试和查看反汇编来验证
  • 这几乎是无用的微优化。
  • 这个问题似乎离题了,因为它是关于未成熟的纳米优化,最好通过实验来回答。
  • 从风格的角度来看 if(b1 == true) 是可怕的。输入/阅读/出错的情况更少 - 而且更习惯 - 使用后者。
  • 忽略其他 cmets:已知 if (b1)if (b1 == true) 快 11%,除了周三,它会慢 17%,除非您使用 g++ -fallow-wednesday-specific-optimisations 进行编译,在在这种情况下,它会快 23%。

标签: c++ optimization


【解决方案1】:

C++11 语言规范是一份英文文档(参见其最新草案n3337),不涉及速度(至少在基本语句中)。

您根本不必担心:任何好的 C++ 编译器都会optimize(至少在被问到时,例如GCCg++ -Og++ -O2 等...),可能会给出相同的机器代码(或者至少是类似性能的代码)。

顺便说一句,如何编译和优化很大程度上取决于目标处理器和if 的主体(例如,因为branch prediction)。有时,编译器会发现使用条件移动可能比条件跳转更快。

使用 GCC,极少 种情况下您可以使用 __builtin_expect 帮助编译器,但您几乎不应该打扰(而且经常错误或过度使用 __builtin_expect 会减慢计算速度)。您也可以考虑适当且非常小心地使用__builtin_prefetch(请参阅this),但同样,您通常不应该在意。

记住premature optimization is evil(几乎总是如此)。

【讨论】:

  • Stroustrup 的书中经常提到性能,如果不是标准的话;它显然推动了许多语言决策。
  • 但该标准不会回答 OP 提出的问题。
  • 当然;我什至不想表现出争论,因为您的答案是正确的;然而,这是一个合理的问题;标准文档本身并不像许多其他 c++ 书籍那样便宜和可读。
  • 我链接到了最新的草稿,据信该草稿与昂贵的标准非常接近(一些错字)。
【解决方案2】:

比性能问题更有趣的是,当您处理类时(而不是普通旧数据 (POD) bool它们的含义不同。一个可能调用== 的重载,而另一个执行布尔转换。

考虑一下:

#include <iostream>
using namespace std;

class Something {
public:
    operator bool() const {
        cout << "Running implicit cast to bool\n";
        return true;
    }
};

bool operator==(Something const & left, bool const & right) 
{
    cout << "Running overloading of ==\n";
    return false;
}

int main() {
    Something s1;
    if (s1 == true) {
        cout << "(s1 == true) branch ran.\n";
    }
    if (s1) {
        cout << "(s1) branch ran.\n";
    }
    return 0;
}

该程序的输出将是:

Running overloading of ==
Running implicit cast to bool
(s1) branch ran.

这是一个需要注意的微妙之处。虽然您不能为 bool 本身重载 ==,但您的语句是等价的——而且几乎肯定会执行相同的操作。

【讨论】:

    【解决方案3】:

    虽然真正的答案是取决于编译器,但我会说 99% 的 casas 是相同的。在这两种情况下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-07
      • 2013-04-02
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 2023-02-07
      相关资源
      最近更新 更多