表现:大于/小于与不相等

时间:2013-09-03 15:40:47

标签: performance jvm comparison

我想知道

之间是否存在性能差异

检查某个值是否大于/小于另一个

for(int x = 0; x < y; x++); // for y > x

检查某个值是否不等于另一个

for(int x = 0; x != y; x++); // for y > x

为什么?

此外:如果我与零比较,会有什么进一步的区别吗?

如果答案还考虑了代码上的分组视图,那将是很好的。

修改 正如大多数人所指出的那样,性能上的差异当然可以忽略不计,但我对cpu级别的差异感兴趣。哪个操作比较复杂?

对我来说,学习/理解这项技术更具问题。

我删除了Java标记,我意外添加了该标记,因为问题通常不仅仅基于Java,抱歉。

8 个答案:

答案 0 :(得分:25)

你仍然应该做更清晰,更安全和更容易理解的事情。这些微调讨论通常是浪费你的时间,因为

  • 他们很少有可衡量的差异
  • 当它们产生影响时,如果您使用不同的JVM或处理器,则可能会发生变化。即没有警告。

注意:生成的机器也可以随处理器或JVM一起更改,因此在大多数情况下,即使您非常熟悉汇编代码,查看这个也不是很有用。

更重要的是软件的可维护性。

答案 1 :(得分:15)

表现绝对可以忽略不计。这里有一些代码来证明它:

public class OpporatorPerformance {
    static long y = 300000000L;

    public static void main(String[] args) {
        System.out.println("Test One: " + testOne());
        System.out.println("Test Two: " + testTwo());
        System.out.println("Test One: " + testOne());
        System.out.println("Test Two: " + testTwo());
        System.out.println("Test One: " + testOne());
        System.out.println("Test Two: " + testTwo());
        System.out.println("Test One: " + testOne());
        System.out.println("Test Two: " + testTwo());

    }

    public static long testOne() {
        Date newDate = new Date();
        int z = 0;
        for(int x = 0; x < y; x++){ // for y > x
            z = x;
        }
        return new Date().getTime() - newDate.getTime();
    }

    public static long testTwo() {
        Date newDate = new Date();
        int z = 0;
        for(int x = 0; x != y; x++){ // for y > x
            z = x;
        }
        return new Date().getTime() - newDate.getTime();
    }

}

结果:

Test One: 342
Test Two: 332
Test One: 340
Test Two: 340
Test One: 415
Test Two: 325
Test One: 393
Test Two: 329

答案 2 :(得分:4)

很少有性能影响,但第一个更可靠,因为它将处理两个特殊情况

  1. y&lt; 0开始
  2. x或y与块内部混乱。

答案 3 :(得分:0)

其他人似乎已经从严格的角度回答了问题,但是从计算机级别上,您会对算术逻辑单元(ALU)感兴趣,该单元可处理“普通计算机”上的数学位。 How does less than and greater than work on a logical level in binary?中似乎有一个很好的细节,可以获取完整的细节。

从纯粹的逻辑层面上来说,简短的答案是,分辨某物是否不是某物比分辨某物是否与某物相对容易,但是,这可能已在您的标准个人计算机或服务器中进行了优化,因此您只会看到在小型个人建筑(例如用于无人机或其他微技术的车载计算机)中的实际收益。

答案 4 :(得分:0)

现在6年后,在仍然偶尔收到此问题的通知后,我想补充一些我在计算机科学学习中获得的见解。

将以上语句放入一个小程序中并进行编译...

public class Comp {
    public static void main(String[] args) {
        int y = 42;

        for(int x = 0; x < y; x++) {
            // stop if x >= y
        }

        for(int x = 0; x != y; x++) {
            // stop if x == y
        }
    }
}

...我们得到以下字节码:

  public static void main(java.lang.String[]);
    Code:
       // y = 42
       0: bipush        42  
       2: istore_1

       // first for-loop
       3: iconst_0
       4: istore_2
       5: iload_2
       6: iload_1
       7: if_icmpge     16      // jump out of loop if x => y
      10: iinc          2, 1
      13: goto          5

       // second for-loop
      16: iconst_0
      17: istore_2
      18: iload_2
      19: iload_1
      20: if_icmpeq     29      // jump out of loop if x == y
      23: iinc          2, 1
      26: goto          18

      29: return

我们看到,在字节码级别上,两者的处理方式相同,并且使用单个字节码指令进行比较。

如前所述,字节码如何转换为汇编程序/机器码取决于JVM。 但通常可以将这种有条件的跳转翻译成如下的汇编代码:

; condition of first loop
CMP eax, ebx
JGE label  ; jump if eax > ebx

; condition of second loop
CMP eax, ebx
JE  label  ; jump if eax == ebx

在硬件级别,JGE和JE具有相同的复杂性。

因此,总而言之:关于性能,x < yx != y在硬件级别上理论上是相同的,并且一个本身并不比另一个快或慢。

答案 5 :(得分:0)

理论上的表现是相同的。当您执行小于或不等于运算时,实际上在处理器级别执行减法运算,并检查结果中是否启用了负标志或零标志。理论上,性能将是相同的。由于区别仅在于检查标志集。

答案 6 :(得分:-1)

选择<=而不是>

我在 Python 3 中遇到了性能差异。 我在 HackerRank 中执行了一个测试用例,结果如下:

   if (value+ k <= i)

代码执行得很快。

   if (i > value + k)

代码执行导致“超出时间限制”错误。

答案 7 :(得分:-2)

不知道是否嵌套了每个测试,结果相同?

for(int x = 0; x < y; x++)
{   
  for(int x2 = 0; x2 < y; x2++)  {}   
}

for(int x = 0; x != y; x++)
{
  for(int x2 = 0; x2 != y; x2++) {}    
}