【问题标题】:Setting or consulting boolean. Which has the best performance?设置或咨询布尔值。哪个性能最好?
【发布时间】:2014-03-24 21:12:59
【问题描述】:

只是为了好奇,哪个过程最快:将值设置为布尔值(例如:将其从 true 更改为 false)或简单检查其值(例如:if(boolean)...)

【问题讨论】:

  • 看一下编译器生成的代码
  • @faranwath:这本身就是一个问题,即知道在哪里寻找并知道要寻找什么并不是一项小任务。
  • 你的意思是在foo = true;if (!foo) foo = true;之间?
  • @Khnle-KevinLe 哦,好吧,一个简单的小程序同时做这两件事怎么样?这不难!
  • @faranwath 实际上,进行基准测试并从中获得有用的结果非常困难。您想专注于一件特定的事情,但您需要包含足够的脚手架,编译器不会将其全部优化。您想要一个代表性基准,但您不想编写整个应用程序。您需要注意影响计时的几十种噪音,并且您需要减轻它们。而且一旦你有正确的测量数据,如果你不验证你的结论,你仍然可以从中得出错误的结论。

标签: c++ performance boolean


【解决方案1】:

我对“哪个最快”的问题是,它们的定义太少而无法真正得到结论性的回答,同时太宽泛而无法得出有用的结论,即使得到了结论性的回答。您的好奇心可以采取的唯一有效途径是建立机器的心理模型并通过它运行这两个案例。

foo = true 将值true 存储到分配给foo 的位置。这就提出了一个问题:foo 存储在哪里以及如何存储?如果不通过具有正确设置的编译器实际运行完整的源代码,这是不可能回答的。它可以在 RAM 中的任何位置,也可以在寄存器中,或者根本不使用存储空间,编译器优化完全消除了它。根据foo 所在的位置,覆盖它的成本可能会有所不同:数百个 CPU 周期(如果在 RAM 中而不是在缓存中)、几个周期(在 RAM 和缓存中)、一个周期(寄存器)、零个周期(不是存储)。

if (foo)一般是指读取foo,然后基于它执行一个条件分支。关于我将在这里讨论的方面(我不得不省略许多细节和一些主要类别),阅读实际上就像写作一样。接下来的条件分支更难以预测,因为它的成本取决于程序的运行时行为。如果分支总是被占用,branch prediction 将使它几乎免费(几个周期)。如果不可预测,可能需要数十个周期并破坏管道(进一步降低吞吐量)。但是,条件代码也有可能是predicated,从而使上述大多数问题无效,并用关于指令延迟、数据依赖性和流水线细节的推理取而代之。

正如您从将要撰写的大量文章中看到的那样(尽管省略了许多细节,甚至一些重要的次要影响),几乎不可能真正笼统地回答这个问题。您需要查看具体、完整的程序来进行任何类型的预测,并且您需要从上到下了解您的整个系统。请注意,我必须假设一种非常特殊的机器才能做到这一点:对于 GPGPU 或嵌入式系统或 90 年代早期的消费级 CPU,我几乎必须重写所有这些。

【讨论】:

  • 哇,我从来没有想过这个问题会有这么复杂的答案。谢谢你:)
【解决方案2】:

我认为这取决于上下文:

  • CPU/架构
  • 布尔值是否存储在内存、缓存或寄存器中
  • if 的背后是什么导致跳转或仅是有条件的移动
  • 布尔值是否可预测

这个问题最终没有意义。

【讨论】:

    猜你喜欢
    • 2011-12-02
    • 2015-01-19
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    相关资源
    最近更新 更多