[英]Why getting the different output regarding the time when inserting to LinkedList and ArrayList
我正在使用LinkedList和ArrayList,我知道將元素添加到ArrayList和LinkedList中的概念,但是當我運行檢查插入時間的代碼時,我對LinkedList和ArrayList一次又一次地獲得不同的插入時間。
有時LinkedList的插入時間會更好,反之亦然,它是如何發生的,請任何人告訴我。
import java.util.ArrayList;
public class Time
{
public static void main(String args[])
{
int n=100000;
long milis = System.currentTimeMillis();
ArrayList obj=new ArrayList();
for(int k=0;k<=n;k++)
{
obj.add(k);
}
System.out.println("insert arraylist takes "
+(System.currentTimeMillis()-milis)+" ms");
}
}
該計划的輸出是
1)插入arraylist需要13 ms 2)插入arraylist需要9 ms
第二個代碼是
import java.util.LinkedList;
public class Time1
{
public static void main(String args[])
{
int n=100000;
long milis = System.currentTimeMillis();
LinkedList obj=new LinkedList();
for(int k=0;k<=n;k++)
{
obj.add(k);
}
System.out.println("insert linklist takes "
+(System.currentTimeMillis()-milis)+" ms");
}
}
這個的輸出
1)插入鏈接列表需要8毫秒
2)插入鏈接列表需要17毫秒
一般來說,鏈表更有效地添加和刪除列表末尾的任何位置,但在查找列表中的任意索引時會慢得多。 要在任何位置添加或刪除元素, LinkedList
只需更改幾個引用,但在ArrayList
,該點之后的所有內容都需要更改。 在查找任意索引方面, ArrayList
只是跳轉到內存中的那個位置, LinkedList
必須遍歷每個項目直到那一點。
這是一個微不足道的例子。 您沒有看到上述內容的原因有兩個:
首先,微基准測試在最好的時候很糟糕,但尤其是在像Java這樣的語言中,你有一個JIT會在這個過程中“熱身”並改變性能。 要么在真實場景中對其進行基准測試,要么就可以向任何真實的性能指標揮手告別。
其次, ArrayList
多年來已經看到了很多優化,我甚至注意到它在某些你經常期望LinkedList
勝出的情況下表現得更快。
就個人而言,我會在我正在使用的真實世界應用程序中使用ArrayList
,而不是微基准測試,並測量性能。 如果性能不可接受,我LinkedList
實現切換到LinkedList
(應該是一行更改),然后再次運行基准測試。 沒有這些檢查,幾乎不可能說出在你的場景中會有更好的表現。
你需要以某種方式使用obj來避免熱點優化你的整個for循環。
每當您開始對Java進行基准測試時,您都必須對結果持懷疑態度。 大多數情況下,您的結果會顯示出您可能期望的不同結果。 影響程序性能的因素太多了。 要制作正確的基准測試,您需要深入了解JVM。 我可以給你的最簡單點:
為了對可以正確解釋的結果做出良好的基准測試,我建議您查看Java Harness並仔細檢查並運行所有示例 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.