对于一个简单的多线程的代码,如下所示,为什么计算需要更长时间的文字?
它需要41338 milliseconds
于具有类似延迟
关闭主线程,始终如一地,如果我与int
替换long
,和比较等i < 0x7FFFFFFF
它需要28 milliseconds
始终与类似的延迟。
机功率:DELL E6430纬度上运行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
等值64位机的价值0x7FFFFFFF
作比较,这是2147483647
请帮助我了解延迟的差异。
这是不是一个有用的做标杆的方法;你的数字将远离真实的表现。您需要担心诸如JIT热身等类似事情,实际上这意味着要使用精心设计的基准测试工具,如Caliper或JMH。你不能从你正在做的测量类型中得到任何有用的数字。 – 2014-12-04 19:48:11
你确定你没有意外地在那里多加一个F吗? – Daniel 2014-12-04 19:48:36
另外,如果你跑了两次程序,有可能第二次跑得更快 – Daniel 2014-12-04 19:49:08