我在將第一個和第二個專案添加到集合中(嘗試ArrayList和HashSet)之間遇到了巨大的性能差異,但我無法解釋原因。已搜索但沒有找到任何答案。
public class Main {
public static void main(String[] args) {
// also tried HashSet
// also tried new ArrayList<>(2)
ArrayList<String> collection = new ArrayList<>();
long t1 = System.nanoTime();
collection.add("a");
long t2 = System.nanoTime();
collection.add("b");
long t3 = System.nanoTime();
System.out.println(String.valueOf(t2 - t1) "\n"
String.valueOf(t3 - t2));
//typical output:
//4399
//1201
}
}
一些猜測:
- 因為在添加第一項時集合被延遲初始化?
- 還是我使用了錯誤的方法來衡量性能?
- 或與 jvm 的作業方式有關(這超出了我的知識范圍)?
環境:jdk11、win10、intellij。
uj5u.com熱心網友回復:
你的三個猜測都是正確的:)
你在問一個很好的問題。請注意:微基準測驗非常危險,您可能很容易對代碼部分的速度做出完全錯誤的假設。您對延遲初始化是正確的,但這是相當幸運的:)
最重要的是你的猜測是正確的,你“使用了錯誤的方法來衡量性能”。
您無法像這樣測量 Java 應用程式的速度。這是不可能的。該程序過于隨機且過于依賴許多其他因素,尤其是運行時的 JIT(即時優化)。
試試看,例如:https : //www.baeldung.com/java-microbenchmark-harness,嘗試運行它并思考它是如何作業的。
TL;DR:JVM 必須首先“預熱”,然后您必須多次運行測驗代碼并計算平均時間。仍然可能有很多優化導致某些代碼根本沒有執行:)
如果你不想玩微基準庫,至少將你的代碼移動到一個方法中并呼叫該方法 20 次。我只是這樣做了(僅替換\n為---),結果是這樣的:
10800---1400
1500---200
600---100
500---100
700---100
400---100
400---100
400---100
400---100
500---100
400---100
400---100
400---100
400---100
300---100
400---100
300---100
500---100
400---100
300---100
正如你所看到的,熱身是最重要的因素。然而,延遲初始化的影響也是可見的。
uj5u.com熱心網友回復:
這是因為 Of 延遲初始化。當你運行這條線時
ArrayList<String> collection = new ArrayList<>();
它僅持有對串列的參考,但該串列不會發生實際的記憶體分配。但是,當您將第一個元素添加到集合中時,它首先為 List 的下 10 個元素分配記憶體(10 是陣列串列的默認大小),然后添加第一個值。接下來的 9 個元素的結果將花費更少的時間來插入,但對于第 11 個元素,它會比以前花費更多的時間。
public static void main(String[] args) {
ArrayList<String> collection = new ArrayList<>();
for (int i = 0; i < 12; i ) {
long t1 = System.nanoTime();
collection.add("a");
long t2 = System.nanoTime();
System.out.println("Index : " (i 1) ": Time: " String.valueOf(t2 - t1));
}
/** Output:
* Index : 1: Time: 6800
Index : 2: Time: 800
Index : 3: Time: 500
Index : 4: Time: 700
Index : 5: Time: 600
Index : 6: Time: 500
Index : 7: Time: 600
Index : 8: Time: 600
Index : 9: Time: 500
Index : 10: Time: 500
Index : 11: Time: 2800
Index : 12: Time: 500
*/
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/404903.html
標籤:
