java - 为什么 "or"在 Java 中比 "and"慢?

标签 java performance

今天我在java中遇到了一个相当惊人的行为,orand慢!

我什至做了一个测试用例,您可以在下面看到它。现在我想知道为什么会这样? 我做错了什么还是只发生在我的电脑上? 我看不出有任何理由 or 应该比 and 慢,特别是有这个显着差异。我想用其他一些语言来测试这个现象,你对这个有什么一般性的想法吗?

public class TestClass {

    public static void main(String[] args) {

        long[] or = new long[10];
        long[] and = new long[10];
        long lStartTime, lEndTime, difference = 0;
        for (int idx = 0; idx < 10; idx++) {

            lStartTime = System.nanoTime();
            for (int i= 0; i < 1000000000; i++) { 
                int j = i | i+1 ;
            }
            lEndTime = System.nanoTime();
            difference = lEndTime - lStartTime;
            System.out.println("Elapsed milliseconds: " + difference/1000000);
            or[idx] = difference;

            lStartTime = System.nanoTime();
            for (int i= 0; i < 1000000000; i++) {
                int j = i & i+1 ;
            }
            lEndTime = System.nanoTime();
            difference = lEndTime - lStartTime;
            System.out.println("Elapsed milliseconds: " + difference/1000000);  
            and[idx] = difference;
            System.out.println("------------------------------------" );

        }

        long tmp = 0;
        for (long l : or) {
            tmp += l;
        }
        tmp /= 10;
        System.out.println("Elapsed milliseconds for or: " + tmp/1000000);
        tmp = 0;
        for (long l : and) {
            tmp += l;
        }
        tmp /= 10;
        System.out.println("Elapsed milliseconds for and: " + tmp/1000000);
    }
}

结果:

Elapsed milliseconds: 1600
Elapsed milliseconds: 1332
------------------------------------
Elapsed milliseconds: 1609
Elapsed milliseconds: 1335
------------------------------------
Elapsed milliseconds: 1609
Elapsed milliseconds: 1335
------------------------------------
Elapsed milliseconds: 1542
Elapsed milliseconds: 1314
------------------------------------
Elapsed milliseconds: 1705
Elapsed milliseconds: 1324
------------------------------------
Elapsed milliseconds: 1559
Elapsed milliseconds: 1315
------------------------------------
Elapsed milliseconds: 1526
Elapsed milliseconds: 1314
------------------------------------
Elapsed milliseconds: 1568
Elapsed milliseconds: 1340
------------------------------------
Elapsed milliseconds: 1551
Elapsed milliseconds: 1318
------------------------------------
Elapsed milliseconds: 1574
Elapsed milliseconds: 1321
------------------------------------
Elapsed milliseconds for or: 1584
Elapsed milliseconds for and: 1325

最佳答案

Bit-Wise OR 并不比 Bit-Wise AND 慢!

在代码中的时间测量片段之间交换,你会得到相反的结果:

for (int idx = 0; idx < 10; idx++) {

    lStartTime = System.nanoTime();
    for (int i= 0; i < 1000000000; i++) {
        int j = i & i+1 ;
    }
    lEndTime = System.nanoTime();

    difference = lEndTime - lStartTime;
    System.out.println("Elapsed milliseconds: " + difference/1000000);  
    and[idx] = difference;

    lStartTime = System.nanoTime();
    for (int i= 0; i < 1000000000; i++) { 
        int j = i | i+1 ;
    }
    lEndTime = System.nanoTime();

    difference = lEndTime - lStartTime;
    System.out.println("Elapsed milliseconds: " + difference/1000000);
    or[idx] = difference;

    System.out.println("------------------------------------");
}

我倾向于猜测 JVM 在第二个片段中应用了某种运行时优化。

关于java - 为什么 "or"在 Java 中比 "and"慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22575304/

相关文章:

java - 蒂卡异常 : Failed to close temporary resource - how to fix?

java - 使用 JNDI 在 Tomcat 中共享 servlet session 对象和数据

c++ - 轻量级C++图像库

MySQL COUNT(id) WHERE 花费的时间太长

C-排序大型2D整数数组的最快方法

java - 膨胀 fragment Google map API 时出错

java - C++键盘键码和JAVA KeyEvent键码之间的区别

performance - 操作寄存器的正确方法(PUT32 vs GPIO->ODR)

c# - 在 C# foreach 条件中放入查询的效率

java - 如何更改服务器上使用的谷歌应用程序引擎的版本