[英]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.