为什么计算需要更长的文字时间?

时间:2014-12-04 19:46:05

标签: java multithreading

对于简单的多线程代码,如下所示,

关闭主线程需要41338 milliseconds,并且具有相似的延迟

如果我将long替换为int,并且与i < 0x7FFFFFFF进行比较,28 milliseconds一致地采用类似的延迟。

机器电源:DELL E6430北纬64位机器运行64位JVM 1.6

public class Dummy {

    private static int NUM_OF_THREADS=200;

    private static Thread[] thread = null;

    public static void loopSomeTime(int i) {
        thread[i] = new Thread(new Runnable(){
            public void run(){
                int count = 0;
                for(long i = 0; i < 0x7FFFFFFFL; ++i){
                    count++;
                }
                System.out.println(count);
            }
        });
        thread[i].start();

    }


    public static void main(String[] args) throws InterruptedException{
        thread = new Thread[NUM_OF_THREADS];
        long beginTime = System.nanoTime();

        for(int i =0; i < NUM_OF_THREADS ; i++){
            loopSomeTime(i);
        }
        //I need to wait here

        for(Thread eachThread : thread){
            eachThread.join();
        }

        long endTime = System.nanoTime() - beginTime;
        System.out.println("Time taken: " +endTime/(1000*1000) + " milliseconds");
    }
}

我将0x7FFFFFFFL的值等同于值0x7FFFFFFF进行比较,即2147483647

请帮助我理解延迟的差异。

1 个答案:

答案 0 :(得分:4)

代码不一样...... 以下是int版本的代码:

  public void run();
    Code:
       0: iconst_0
       1: istore_1
       2: iconst_0
       3: istore_2
       4: iload_2
       5: ldc           #2                  // int 2147483647
       7: if_icmpge     19
      10: iinc          1, 1
      13: iinc          2, 1
      16: goto          4
      19: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      22: iload_1
      23: invokevirtual #4                  // Method java/io/PrintStream.println:(I)V
      26: return
}

以下是long版本的代码:

  public void run();
    Code:
       0: iconst_0
       1: istore_1
       2: lconst_0
       3: lstore_2
       4: lload_2
       5: ldc2_w        #2                  // long 2147483647l
       8: lcmp
       9: ifge          22
      12: iinc          1, 1
      15: lload_2
      16: lconst_1
      17: ladd
      18: lstore_2
      19: goto          4
      22: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
      25: iload_1
      26: invokevirtual #5                  // Method java/io/PrintStream.println:(I)V
      29: return
}

您可以观察到使用的JVM指令不一样。 int使用算术时long递增。粗略地说:int代码使用寄存器而不是long代码。

这解释了至少在我的电脑和你的电脑上的区别。

它使用了java:

java version "1.8.0_20"
Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode)

和javac

javac 1.8.0_20

在MacOSX 10.9平台上

我的JVM是64位......