簡體   English   中英

為什么在插入LinkedList和ArrayList時得到關於時間的不同輸出

[英]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。 我可以給你的最簡單點:

  • JIT熱身(你的第一個基准測試結果通常會比以后差很多)
  • DCE又名死代碼終結。 這不是你的情況,但了解它也很有用

為了對可以正確解釋的結果做出良好的基准測試,我建議您查看Java Harness並仔細檢查並運行所有示例

暫無
暫無

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

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