簡體   English   中英

為什么第一個“新”比其他“慢”?

[英]why the first `new` is slower than the others?

我正在測試Java代碼的性能,但是我注意到第一個new操作要比其他操作慢。 為什么?

第一時間new和其他4

Foo g; // The first new in the first iteration
for (int i = 0; i < 5; i++) {
    t1 = System.nanoTime();
    g = new Foo(a[i], b[i]);
    t2 = System.nanoTime();
    v[i] = t2 - t1;
}

v的元素(以ns為單位的時間):

3669398
230476
230611
234191
181668

第一次之后的其他5個new時間

Foo g = new Foo(a[0], b[0]); 
for (int i = 1; i < 6; i++) {
    t1 = System.nanoTime();
    g = new Foo(a[i], b[i]);
    t2 = System.nanoTime();
    v[i - 1] = t2 - t1;
}

v的元素(以ns為單位的時間):

254028
222352
222488
228581
219776

這可能是由於多個問題。

最簡單的是,當您執行第一個新類時,可能尚未加載該類,因此類加載器需要首先加載該類。 那取決於實際的代碼和環境。

一個更復雜但同樣可行的原因是Java優化的方式。 編譯后Java沒有完成優化。 在運行時,Java一直在不斷優化。

例如,通過if語句進行的前幾次操作可能會比較慢,但是如果運行時優化器意識到您每次都可能以相同的方式進行分支,則可能會對其進行優化,然后突然在該運行時的余下時間開始更快地運行。

這會對您有多大影響,取決於Foo的工作。 但是,如果這引起您報告的巨大差異(大約高15倍),我會感到驚訝。 我不確定實際的差異是什么,因為我沒有測量它們,所以也許我低估了這種可能性。

而且,幾次執行動作也不是一個好的基准。 如果您的測試用例真的和您的示例一樣簡單,那么可能還會有其他問題,而且涉及范圍很廣。 也許運行時剛剛啟動仍然處於沉重的負擔中,所以線程會保持屈服,包括在第一次迭代期間。 我可能會wild測,但這就是為什么我們真的需要知道為什么一件事與另一件事不同的原因,所以我們進行了大量測試的一部分。

暫無
暫無

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

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