【问题标题】:Which is faster "If (bool) {true} else {false}" or "bool ? true : false"? Why? In every languages? [duplicate]“If (bool) {true} else {false}”或“bool ? true : false”哪个更快?为什么?在每种语言中? [复制]
【发布时间】:2013-06-27 19:53:48
【问题描述】:

这是我在想的,当我在谷歌搜索时找不到答案(可能我不知道关键字)。只是出于好奇,没有在任何项目中实施。

哪个更快:

if (bool)
   return true;
else
   return false;

bool ? true : false;
  • 他们平等吗?

  • 为什么?

  • 在每一种语言、每一种系统中,一个人都比另一个人快?

(如果有人知道微控制器、iOS 或 Java 的 Obj-C 的答案,我非常感谢您对我的问题的回答)

编辑: 我不知道bool ? true : false 被称为三元,正如我所说的“我不知道关键字”。

【问题讨论】:

  • yesno 是什么?
  • 后者通常更快。第一个是分支,如果硬件不够“智能”,它们可能会很慢。第二个是一个表达式,像 1+2 一样被评估
  • @Enzo - 第二个也在分支。
  • @JonSkeet 只是返回值,与truefalse 相同。
  • @GBF_Gabriel:如果是实际上truefalse,你可以直接返回bool...

标签: java ios optimization if-statement microcontroller


【解决方案1】:

这个问题有很多问题。

  1. 首先,语言没有性能特征。您无法衡量语言的性能。您只能衡量一种语言的实现。任何给定的语言都可以有很多不同的实现。

  2. 所有语言都支持与这两者等效的结构的想法是幼稚的......而且是不正确的。

  3. 某种东西可能在所有语言、所有实现和所有系统中以相同的方式执行的想法是异想天开的。

  4. 任何人都知道...所有语言、平台、硬件等的想法是幻想。

  5. 目前尚不清楚这两个话语的含义。在 Java 中(例如)它们并不意味着同样的事情......第二个不是有效的陈述......即使你添加了 ; ......即使它是,它也不 返回任何东西。


话虽如此......在Java中(假设您在第二种情况下添加return):

  • 它们的意思是一样的,而且

  • 现代 Hotspot JIT 编译器可能会将这些编译为等效的本机代码;即可能没有性能差异。

【讨论】:

  • +1 在比较未优化代码的性能时,最重要的是编译器是否可以检测到冗余代码并将其删除。
【解决方案2】:

至少在 Java 中,除了在第一种情况下可以逐行调试之外,它们之间没有区别。对于这两种情况,编译后的字节码很可能完全相同。我怀疑在您询问的每个环境中都是如此。

【讨论】:

    【解决方案3】:

    速度差异发生在机器代码级别,在该级别甚至无法猜测您将哪个习语编译到其中。因此你的答案是:你的习语的选择和表现之间没有相关性。大多数情况下它应该完全相同,但如果不是,将没有普遍适用的解释。

    【讨论】:

      【解决方案4】:

      通常更快的是

      return bool;
      

      这避免了条件产生的任何可能的分支,在具有昂贵分支未命中的 CPU 上更快。无论如何,优化编译器可能会删除该分支,但由于这与语言无关,因此无法保证。

      【讨论】:

      • 您假设 yesno 是布尔值。
      • ...这不太可能;)
      • @TedHopp,@snoreven,OP 明确表示 yesno 在他的问题 cmets 中是 truefalse
      • YES 和 NO 是 Objective C 中的布尔值,Objective C 是提问者提到的语言之一。
      • 也许在其中一种语言中......通常我不认为“是”是一个布尔值......
      【解决方案5】:

      条件表达式与三元是有争议的。这是您在这两种情况下都不会注意到差异的情况之一。

      如果你有一个 if/else(应该是这样,不需要 else if 在那里),三元会更快。

      但是,添加额外的检查更加困难,因为您需要链接三元: (conditional) ? ((conditional) ? true : false) : ((conditional) ? true : false) 所以很难阅读。

      如果可以扩展,最好的选择是使用switch,它比if/else 检查更快。如果您希望允许多个 if 产生相同的结果,则尤其如此,但如果您使用数据类型检查,则它没有用,因为它使用松散比较(== and never === checks)。与 if/elseif/else 对不同,switch 可能会使用更多的内存和时间,如果你从不中断的话。

      【讨论】:

      • +1 用于提议切换。 :)
      • 声称 switch 比if/else 检查更快的理由是什么?根据 switch 表达式和 case 中涉及的值的类型和范围,它们通常是完全等价的。
      • 是的,但它在语法上比其他的简单......
      【解决方案6】:

      Ternaryif-else 的性能相同。

      三元运算符只是简写。它们编译成等效的 if-else 语句。

      【讨论】:

        【解决方案7】:

        他们是平等的吗?

        逻辑上是的。在这里做同样的事情。第二种叫做三元运算符。

        在每一种语言、每一种系统中,一个人都比另一个人快?

        在java中没有区别。我怀疑是否还有其他语言的表演。即使是这样,那我想差异也将非常微不足道。您最好专注于更具可读性的代码。第一个肯定更具可读性。

        【讨论】:

          【解决方案8】:

          它们在性能上几乎相等,或者如果不是,则存在非常非常微不足道的差异。

          对于像您要求的那样简单的事情,我会使用三元运算符?:,因为它更短且可读性强。

          当你需要做多个语句时,使用 if-else。

          请记住,您也可以在返回语句中使用?:

          return bool ? yes : no;
          

          编辑:看起来您只想返回布尔值。如果你这样做了,那么你只需要输入:return bool;

          【讨论】:

            猜你喜欢
            • 2019-12-29
            • 1970-01-01
            • 2022-10-23
            • 1970-01-01
            • 2014-04-25
            • 2011-12-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多