性能:大于/小于vs不等于

rdlzhqv9  于 2021-06-29  发布在  Java
关注(0)|答案(7)|浏览(739)

我想知道这两个国家的表现是否有差别
检查一个值是否大于/小于另一个值

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


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

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

为什么?
另外:如果我和零比较,会有进一步的区别吗?
如果答案中也考虑到对代码的认可,那就太好了。
编辑:正如你们大多数人指出的,性能上的差异当然可以忽略不计,但我对cpu级别上的差异感兴趣。哪个操作更复杂?
对我来说,学习/理解这项技术更像是一个问题。
我移除了 Java 我无意中添加了这个标签,因为这个问题的意思通常不只是基于java,对不起。

zsohkypk

zsohkypk1#

性能完全可以忽略不计。下面是一些代码来证明这一点:

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
nwo49xxi

nwo49xxi2#

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

yqkkidmi

yqkkidmi3#

你仍然应该做更清楚,更安全,更容易理解的事情。这些微调讨论通常是浪费您的时间,因为
它们很少产生可衡量的影响
如果使用不同的jvm或处理器,当它们产生影响时,这种情况可能会改变。i、 e.没有警告。
注意:生成的机器也可以随着处理器或jvm的变化而变化,因此在大多数情况下,即使您非常熟悉汇编代码,这样做也没有多大帮助。
更重要的是软件的可维护性。

z6psavjg

z6psavjg4#

很少会出现性能下降,但第一个更可靠,因为它将处理两种特殊情况,其中
y<0开始
x或y在块内被弄乱了。

ghhaqwfi

ghhaqwfi5#

现在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 < y 以及 x != y 从理论上讲,在硬件层面上是相同的,一个本身并不比另一个快或慢。

snz8szmq

snz8szmq6#

其他人似乎已经从一个测量的Angular 来回答了这个问题,但是从机器的Angular 来看,你会对算术逻辑单元(alu)感兴趣,它在“普通计算机”上处理数学位。在二进制的逻辑级别上,小于和大于是如何工作的,似乎有一个相当详细的细节?完整的细节。
从纯粹的逻辑层面来看,简单的答案是,判断某事物是否是某事物比判断某事物是否与某事物相关要容易得多,然而这很可能已经在您的标准个人计算机或服务器中进行了优化,所以你只会在小型个人产品中看到实际的收益,比如无人机的机载电脑或其他微型技术。

2hh7jdfx

2hh7jdfx7#

想知道是否每个测试都嵌套了相同的结果?

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++) {}    
}

相关问题