繁体   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