對於一個簡單的多線程的代碼,如下所示,爲什麼計算需要更長時間的文字?
它需要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