2013-12-19 28 views
6

我聽到了System.out.println();的Java語句是昂貴的(它消耗了大量的時間)
所以我試圖評估其成本:
當我評價5個報表... The cost = 1.0
因此,我希望1條語句的成本= 0.2
但實際上我發現了The cost = 0.0System.out.println()的消耗時間; Java語句?

double t1 = 0; 
double t2 = 0; 

t1 = System.currentTimeMillis(); 
System.out.println("aa"); 
System.out.println("aa"); 
System.out.println("aa"); 
System.out.println("aa"); 
System.out.println("aa"); 
t2 = System.currentTimeMillis(); 
System.out.println("The cost = " + (t2-t1)); 
// The cost = 1.0 


t1 = System.currentTimeMillis(); 
System.out.println("aa"); 
t2 = System.currentTimeMillis(); 
System.out.println("The cost = " + (t2-t1)); 
// The cost = 0.0 
// Expected : 1.0/5 = 0.2 -- But Actual : 0.0 

爲什麼呢?

+2

您應該將您的基準測試中的呼叫計數增加到循環中的5000。 **然後**你可能會得到更好的輸出! – bobbel

+0

問題在你的代碼中,而不是在'system.out.println'中。 –

+1

你知道,即使是一毫秒,該死的成本也很高,因爲正常的CPU可以在那段時間處理幾百萬條指令? – Matthias

回答

9

System#currentTimeMillis返回long而不是double。因此你失去了.2

測試5個語句不是一個好主意,特別是當您幾乎感覺不到執行它所需的時間時。我建議你有5個以上的陳述來測試,然後把數量減少到1以上。

你想要做一個精確的測量時間,最好使用System#nanoTime,因爲它提供了時間納米秒

long startTime = System.nanoTime(); 
// ... the code being measured ... 
long estimatedTime = System.nanoTime() - startTime; 

尋找「nanoTime VS的currentTimeMillis」,你會得到幾百文章。

+3

你還會教導'currentTimeMillis'和'nanoTime'之間的區別嗎?然後,我可以跳過自己的嘗試來回答另一個無效的基準測試問題:) – Matthias

3

當我測試你的代碼時,輸​​出總是0.0。請您嘗試與基準System.nanoTime(); 或者更System.out.println()

double t1 = 0; 
    double t2 = 0; 

    t1 = System.currentTimeMillis(); 
    for(int i = 0; i<1000; i++) 
     System.out.println("aa"); 
    t2 = System.currentTimeMillis(); 
    System.out.println("The cost = " + (t2-t1)); 


    t1 = System.currentTimeMillis(); 
    for(int i = 0; i<100; i++) 
     System.out.println("aa"); 
    t2 = System.currentTimeMillis(); 
    System.out.println("The cost = " + (t2-t1)); 

輸出做到這一點:62.0和5.0

和1.2毫秒的這種差異是因爲循環而運行變快。

3

如果執行時間少於1毫秒,您什麼也看不到,因爲時鐘還沒有'打勾'。對於這種類型的微型基準測試,您應該使用類似於:

long t1 = System.nanoTime() 

爲您的時間測量。 (這測量時間以納秒爲單位,儘管並不總是具有這麼多的粒度)

1

此外,完成System.out.println的時間將在功能強大的計算機上不同,以及計算機執行其他操作時的繁忙程度在特定時刻的任務。