我正在使用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毫秒
答案 0 :(得分:1)
一般来说,链接列表在添加和删除除列表末尾之外的任何位置时更有效,但在查找列表中的任意索引时会慢得多。要在任何位置添加或删除元素,LinkedList
只需更改几个引用,但在ArrayList
之后,该点之后的所有内容都需要更改。在查找任意索引方面,ArrayList
只是跳转到内存中的该位置,LinkedList
必须遍历每个项目直到该点。
这是一个微不足道的例子。您没有看到上述内容有两个主要原因:
首先,微基准测试在最好的时候很糟糕,但尤其是在像Java这样的语言中,你有一个JIT会在这个过程中“热身”并改变性能。无论是在现实世界的场景中进行基准测试,还是可以与任何真实的性能指标相提并论。
其次,ArrayList
多年来已经看到了很多优化,我甚至注意到它在某些情况下表现得更快,在这些情况下你经常期望LinkedList
获胜进行。
就个人而言,我会将ArrayList
放在我正在使用的真实世界应用程序中,而不是微观基准测试,并测量性能。如果性能不可接受,我会将实现切换到LinkedList
(这应该是一行更改),然后再次运行基准测试。如果没有这些检查,几乎不可能说出你的情景会有什么表现。
答案 1 :(得分:0)
你需要以某种方式使用obj来避免热点优化你的整个for循环。
答案 2 :(得分:-1)
每当你开始对java进行基准测试时,你必须对你的结果持怀疑态度。大多数情况下,您的结果会显示出您可能期望的不同结果。影响程序性能的因素太多了。要制作正确的基准测试,您需要深入了解JVM。我能给你起最简单的一点:
为了对可以正确解释的结果做出良好的基准测试,我建议您查看Java Harness并仔细检查并运行所有examples。