Java 两个小结构的性能差异

Java 两个小结构的性能差异,java,performance,if-statement,conditional-statements,Java,Performance,If Statement,Conditional Statements,我想知道下面两个之间是否有性能差异 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 } 接下来的两个呢 if(i>=0){ //some code here } //and if(i>-1)

我想知道下面两个之间是否有性能差异

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
}
接下来的两个呢

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
}
是否将
=
内部转换为
|124;==


另外,性能差异非常小,可以忽略不计,但我想知道是否存在任何性能差异?

我认为第一种方法更好

第二个需要3个比较:

  • if(i>0)
  • if(i==0)
  • 布尔或等于1。二,
  • 但是,实际结果仍然取决于编译器是否能够优化这两个代码使其相同(因为它们做的是相同的事情)


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

    我认为第一种方法更好

    第二个需要3个比较:

  • if(i>0)
  • if(i==0)
  • 布尔或等于1。二,
  • 但是,实际结果仍然取决于编译器是否能够优化这两个代码使其相同(因为它们做的是相同的事情)


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

    您可以使用
    objdump
    检查相应的汇编代码,或者检查在运行时实际失效的指令数。但是,使用管道,所需的实际周期可能不太清楚。

    您可以使用
    objdump
    检查相应的汇编代码,或者检查在运行时实际失效的指令数。然而,对于管道,所需的实际周期可能不太清楚。

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

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

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



    FWIW-我认为现代JIT编译器将在所有这两种情况下为子类生成等效的本机代码;i、 e.使用哪一个对性能没有影响。但是
    i>0 | i==0
    是毫无意义的混淆,因此应该避免;i、 它将取决于Java安装中的硬件平台、ISA和JIT编译器

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

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



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

    在现代JVM上,我认为这种思维方式是毫无意义的。JVM不只是编译代码并停止。它在运行时了解您的代码,并相应地修改其行为。现在我不是一个编译器专家,但据我所知,JVM可以非常智能,如果它看到
    I
    的值总是求值为真或假,它基本上可以在运行时优化整个
    if
    语句

    每当你想用这样的微观方式“优化”你的代码时,只要停下来提醒自己,你没有JVM那么聪明,因为它会作弊。它可以实际查看代码在运行时的行为,并相应地更改其行为

    请查看Steve Yegge演讲中的精彩内容,该演讲暗示了虚拟机可以给人留下多么深刻的印象。这是几年前的事了

    添加了更好的示例

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


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

    每当你想用这样的微观方式“优化”你的代码时,只要停下来提醒自己,你没有JVM那么聪明,因为它会作弊。它可以实际查看代码在运行时的行为,并相应地更改其行为

    请查看Steve Yegge演讲中的精彩内容,该演讲暗示了虚拟机可以给人留下多么深刻的印象。这是几年前的事了

    添加了更好的示例

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


    它取决于实现,因此您需要为您的特定pla进行基准测试