2014-01-24 53 views
5

當嘗試使用System.nanoTime()調查各種任務的運行時時,當輸入數據集足夠大時,該值變爲負值。System.nanoTime()變爲負

使用的示例代碼:

long start = System.nanoTime(); 
run(); 
long stop = System.nanoTime(); 

int diff = (int) (stop-start); 
System.out.println(data_size+", "+diff); 

的輸出,在一個越來越大的數據集調用run()時,看起來是這樣的:

1, 80000 
10, 4310000 
50, 48077000 
100, 171363000 
250, 1061924000 
500, 14018704 
750, 998074408 
1000, -41025184 
1500, -81710664 
2000, -273795736 
2500, 768997600 
3000, -39161248 

這是否有道理的人?

+0

可能的重複[爲什麼我使用System.nanoTime得到負的消逝時間()?](http://stackoverflow.com/questions/7866206/why-i-get-a-negative-elapsed-time-using-system-nanotime) – turbo

+1

@turbo這不是重複的問題;這是由於轉換爲「int」的差異造成的。 – rgettman

回答

12

您將兩個long之間的差異轉換爲int。可能,您的long區別長於Integer.MAX_VALUE(約20億),並且投射到int需要最後32位,產生負數。此外,20億納秒只有2秒,所以任何時間都會溢出int

保持差異爲long

0

我想這是一個整數溢出問題。 int範圍是:

Integer.MAX_VALUE = 2147483647 
Integer.MIN_VALUE = -2147483648 

嘗試使用long存儲diff值代替:

long diff = stop - start; 
0

在Java中,一個用於一個int(由32位表示)的最大數目是2^31或2147483647 。 發生什麼事是,當差異大於這個數字時,它不能用int表示,並且溢出(用完比特)