簡體   English   中英

為什么第一種方法調用總是花費最長的?

[英]Why does the first method call always take the longest?

在閱讀Stack Overflow上的類似主題后,我編寫了以下代碼以了解System.nanoTime()一致性。

它只是在方法調用空void函數之前和之后調用System.nanoTime() ,記錄進程中的已用時間。 但是,正如您在結果中看到的那樣,第一次調用總是花費最長的時間。 這是什么原因?

public class Test {
    public static void main(String[] args) {
        for(int i = 0; i < 10; i++) {
            double start = System.nanoTime();
            foo();
            double end = System.nanoTime();
            double diff = end - start;
            System.out.println("Diff: " + diff);
        }
    }

    public static void foo() {

    }
}

結果:

Diff: 2765.0
Diff: 509.0
Diff: 236.0
Diff: 238.0
Diff: 230.0
Diff: 539.0
Diff: 359.0
Diff: 356.0
Diff: 380.0
Diff: 353.0

請注意,我確實讀過這個問題: 為什么首先在Citrix上調用java.io.File.createTempFile(String,String,File)需要5秒?

此外,此鏈接有助於將來參考,但不一定能回答我的具體問題: 如何在Java中編寫正確的微基准測試?

JVM懶洋洋地執行類解析(參見JVMS 5.4.3 )。 在您的情況下,常量池中foo的符號引用在第一次執行invokestatic字節碼時解析,即在方法的第一次調用時解析。 顯然,它比執行已經解析的字節碼需要更多的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM