2013-01-05 18 views
0

我需要獲取Java中函數的執行時間。我知道我可以使用的兩種方法: currentTimeMillis();nanoTime();但是我知道currentTimeMillis();更準確,如果我需要掛鐘時間(也就是說,就好像我從掛鐘那樣測量執行花了多少時間不是處理時間)。如何使用currentTimeMillis()方法獲得小部分的執行時間

currentTimeMillis();不能給我小分數。例如,如果執行時間小於1毫秒,則返回0.即使該時間小於1,即0.05毫秒,我也需要時間。這是一個簡單的例子,當該方法返回0

long startTime=System.currentTimeMillis(); 
for(int x=0; x<10;x++) 
{ 
    System.out.println("-"); 
} 

long execTime=System.currentTimeMillis() - startTime; 

即使它返回時,它返回其作爲30或40。但是,我需要更精確的數目,也就是說,30.00012。此外,方法返回類型是long,但我將其更改爲double,因爲我想要浮點數,這是否有任何傷害?你能告訴我通過我可以用來衡量在小部分數量的我的Java方法執行掛鐘時間(例如,不8.0,但8.287335)

+1

你有沒有想過使用探查器? –

+1

「但我把它改成了'double',因爲我想要浮點數,這有什麼害處嗎?」如果返回的毫秒或納秒數大於'2^53',則會產生四捨五入效應,但大多數情況下,由於定時器返回整數值,因此它毫無意義。 –

回答

0

儘管您可以也應該使用nanoTime來獲取代碼塊的最精確的可用執行時間。但是,您應該謹慎使用它,因爲有許多外部問題會影響執行時間。例如,任何時候一個方法被調用而沒有最近運行,將會有開銷讓它進入緩存。根據同一頁面中的其他內容,甚至可能會讀取磁盤以將其讀入內存。

如果一個JVM只運行一次而不是運行多次,則JVM可能會以不同的方式處理該方法。

通常,當你關心微秒時,這是因爲你測量的東西會在工作或交易中多次運行。爲了獲得準確的測量結果,您需要測量多次呼叫。這樣做也可以減少調用nanoTime的開銷時間的影響。

6

正確的方法,我知道的兩種方法,我可以使用:currentTimeMillis()nanoTime()。但是我知道currentTimeMillis()更準確,如果我需要掛鐘時間(也就是說,我正在從掛鐘測量執行時間,而不是處理時間)。

這只是部分準確。

這兩個函數都返回掛鐘時間,而不是CPU時間。

與精度不同的是,currentTimeMillis()與衆所周知的時間點相關,而nanoTime()與某個任意時間點有關。這意味着您不能將nanoTime()的結果輕鬆轉換爲您和我理解的時間戳。

您仍然可以使用它來測量掛鐘時間間隔:只需撥打nanoTime()兩次並採取差異。這幾乎是它的設計目的。

最後,如果你使用這個來剖析一些代碼,請閱讀How do I write a correct micro-benchmark in Java?有很多微妙之處。

+0

您可以檢查:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/System.html#nanoTime%28%29。他們說:'並不涉及系統或掛鐘時間的任何其他概念。我誤解了什麼嗎? –

+2

@WiliamA您引用的文件說「只能用於測量經過時間」。您正在嘗試測量已用時間,因此沒有問題。問題在於nanoTime結果與日期無關。如果你在週三開始一個長時間運行的工作,並在週四開始另一項工作,那麼週三工作中的nanoTime調用可能會比周四工作稍後發生的nanoTime調用產生更大的結果。 –

+1

@WiliamA:我認爲混淆是術語。 'nanoTime()'秒的秒數與你的和我的相同。沒有定義的是'nanoTime()'開始計算的* origin *。您仍然可以減去兩個'nanoTime()'值並獲得有意義的結果。 – NPE

1

使用System.nanoTime()它具有納秒級的精度。

相關問題