为什么在插入LinkedList和ArrayList时得到关于时间的不同输出

时间:2013-05-31 11:34:58

标签: java arraylist linked-list

我正在使用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毫秒

第二个代码是

 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毫秒

3 个答案:

答案 0 :(得分:1)

一般来说,链接列表在添加和删除除列表末尾之外的任何位置时更有效,但在查找列表中的任意索引时会慢得多。要在任何位置添加或删除元素,LinkedList只需更改几个引用,但在ArrayList之后,该点之后的所有内容都需要更改。在查找任意索引方面,ArrayList只是跳转到内存中的该位置,LinkedList必须遍历每个项目直到该点。

这是一个微不足道的例子。您没有看到上述内容有两个主要原因:

  • 首先,微基准测试在最好的时候很糟糕,但尤其是在像Java这样的语言中,你有一个JIT会在这个过程中“热身”并改变性能。无论是在现实世界的场景中进行基准测试,还是可以与任何真实的性能指标相提并论。

  • 其次,ArrayList多年来已经看到了很多优化,我甚至注意到它在某些情况下表现得更快,在这些情况下你经常期望LinkedList获胜进行。

就个人而言,我会将ArrayList放在我正在使用的真实世界应用程序中,而不是微观基准测试,并测量性能。如果性能不可接受,我会将实现切换到LinkedList(这应该是一行更改),然后再次运行基准测试。如果没有这些检查,几乎不可能说出你的情景会有什么表现。

答案 1 :(得分:0)

你需要以某种方式使用obj来避免热点优化你的整个for循环。

答案 2 :(得分:-1)

每当你开始对java进行基准测试时,你必须对你的结果持怀疑态度。大多数情况下,您的结果会显示出您可能期望的不同结果。影响程序性能的因素太多了。要制作正确的基准测试,您需要深入了解JVM。我能给你起最简单的一点:

  • JIT热身(你的第一个基准测试结果通常会比以后差很多)
  • DCE又名死代码终结。这不是你的情况,但了解它也很有用

为了对可以正确解释的结果做出良好的基准测试,我建议您查看Java Harness并仔细检查并运行所有examples