我定義了一個包含資訊的類:
public static class Node {
Node prev;
public Node() {
}
public Node(Node prev) {
this.prev = prev;
}
}
測驗案例1:
@Test
public void test1() {
long start = System.nanoTime();
for (int i = 0; i < 10_000_000; i ) {
Node newNode = new Node();
}
long timeRun = System.nanoTime() - start;
System.out.println("nanoTime: " timeRun);
}
對于上面的測驗用例,我的機器完成需要納秒8434100-> 0.008 秒
測驗案例2:
@Test
public void test() {
Node last = null;
long start = System.nanoTime();
for (int i = 0; i < 10_000_000; i ) {
Node newNode = new Node();
last = newNode ;
}
long timeRun = System.nanoTime() - start;
System.out.println("nanoTime: " timeRun);
}
在上面的例子中,我將創建一個存盤變數last來存盤最后一個node物件。
對于上面的測驗用例,我的機器完成需要納秒9522600-> 0.009 秒
測驗案例3:
在這種情況下發生突變。
@Test
public void test() {
Node last = null;
long start = System.nanoTime();
for (int i = 0; i < 10_000_000; i ) {
Node newNode = new Node(last);
last = newNode ;
}
long timeRun = System.nanoTime() - start;
System.out.println("nanoTime: " timeRun);
}
案例 3,與案例 2 非常相似,但我會將last物件傳遞給constructorof Node。對于上述測驗用例,我的機器完成需要納秒933890100-> 0.9 秒。
令人驚訝的是,它慢了 100 倍。
測驗案例 4:
@Test
public void test() {
List<Node> list = new ArrayList<>();
Node last = null;
long start = System.nanoTime();
for (int i = 0; i < 10_000_000; i ) {
Node newNode = new Node(last);
list.add(newNode);
last = newNode ;
}
long timeRun = System.nanoTime() - start;
System.out.println("nanoTime: " timeRun);
}
在情況 4 中,我有一個list要存盤newNode的串列。對于上述測驗用例,我的機器完成需要納秒360559900-> 0.3 秒。它比情況 3 快。java 重新優化了嗎?
問題
你知道為什么它很慢嗎?請讓我知道。我已經研究并閱讀了很多但還沒有答案
uj5u.com熱心網友回復:
兩個問題:
正如Dave Newton 所說,微基準具有誤導性。此問題的答案中的更多內容:How do I write a correct micro-benchmark in Java?
但也有可能:因為在情況 1 和 2 中,您不會
Node在記憶體中建立一千萬個物件,在任何給定時間您最多只有兩個。隨著您的進行,您會釋放以前的節點。但是在第 3 種情況下,您保留了Node您創建的所有物件,因此您最終會在記憶體中保留一千萬個小物件。這在記憶體管理方面需要大量開銷,從而顯著減慢速度。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/377312.html
上一篇:在std::vector的末尾插入幾個值最好是什么?
下一篇:Julia:抽象型別與型別聯合
