对于简单的多线程代码,如下所示,
关闭主线程需要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
请帮助我理解延迟的差异。
答案 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位......