【问题标题】:Performace difference of two small construct两个小结构的性能差异
【发布时间】:2012-07-22 08:39:45
【问题描述】:

我想知道以下两者之间是否有任何性能差异?

if(i>=0){
    //some code here
}

//and

if(i>-1){
    //some code here
}

那么下面两个呢?

if(i>=0){
    //some code here
}

//and

if(i>0 || i==0){
    //some code here
}

>= 会在内部转换为> || == 吗?

附:性能差异会很小,可以忽略不计,但我想知道有什么性能差异吗?

【问题讨论】:

  • 在每秒百万CPU动作的时代,保存一个动作的动机是什么?
  • @alfasin - 对性能的痴迷就像火车定位 - 很难解释 :-)

标签: java performance if-statement conditional-statements


【解决方案1】:

我相信第一种方法更好。

第二个需要3次比较:

  1. if (i > 0)
  2. if (i == 0)
  3. 1. 和 2. 的布尔 OR。

但是,实际结果仍然取决于编译器是否能够将这 2 个代码优化为相同(因为它们在做同样的事情)。

也许基准是一个更好的主意。

【讨论】:

    【解决方案2】:

    您可以使用objdump 检查相应的汇编代码,或检查在运行时实际退出的指令数量。但是,对于流水线,实际所需的周期可能并不那么清楚。

    【讨论】:

      【解决方案3】:

      答案将取决于平台;即它将取决于您的 Java 安装中的硬件平台、ISA 和 JIT 编译器。

      这使得知道答案变得毫无意义......因为您不想浪费时间对特定硬件/ISA/JIT 编译器平台进行微优化。

      但是,如果您确实需要知道,那么您应该对其进行基准测试...注意完成所有您需要做的事情,以便从 Java 基准测试中获得有效结果。


      FWIW - 我认为现代 JIT 编译器将为所有两种情况下的子情况生成等效的本机代码;即它应该对您使用的性能没有影响。但是i>0 || i==0 是毫无意义的混淆,因此应该避免。

      【讨论】:

        【解决方案4】:

        在现代 JVM 上,我认为这种想法毫无意义。 JVM 不只是编译代码并停止。它在运行时了解您的代码并相应地修改其行为。现在我不是编译器专家,但据我了解,JVM 可以非常聪明,如果它看到i 的值总是评估为真或假,它基本上可以在运行时优化你的整个if 语句。

        每当您想以这样的微观方式“优化”您的代码时,请停下来提醒自己,您不如 JVM 聪明,因为它会作弊。它可以实际查看您的代码在运行时所做的事情并相应地更改其行为。

        查看 Steve Yegge 演讲的精彩记录,其中暗示了 VM 可以有多么令人印象深刻。这是几年前的事了!

        http://steve-yegge.blogspot.com/2008/05/dynamic-languages-strike-back.html

        添加了更好的示例

        这些是 Josh Bloch 演讲中的幻灯片,他谈到现在微基准测试是多么不可能。您无法查看源代码行并知道 JVM 在运行时会做什么。我最喜欢的幻灯片是像 && 这样的短路操作员过去总是更快,但在现代硬件上,这并不总是如此。完全违反直觉,这意味着您应该停止尝试走这条路。

        http://wiki.jvmlangsummit.com/images/1/1d/PerformanceAnxiety2010.pdf

        【讨论】:

          【解决方案5】:

          它取决于实现,因此如果您真的关心,您需要针对您的特定平台进行基准测试。

          话虽如此:

          • 前两个可能在任何合理的现代硬件/JVM 组合上都是等效的。所有比较在现代硬件上的表现往往相同。
          • 对于后两个,第一个选项可能更快。虽然聪明的编译器会发现等价性并产生相同的单一本地操作,但我相信一些当前的 JIT 编译器不会发现这一点。但无论如何您都应该使用第一个选项,因为它更易于阅读和维护。

          【讨论】:

            猜你喜欢
            • 2012-07-21
            • 2011-03-30
            • 1970-01-01
            • 2020-11-16
            • 1970-01-01
            • 2010-11-10
            • 1970-01-01
            • 2023-02-07
            • 1970-01-01
            相关资源
            最近更新 更多