java – 为什么迭代通过LinkedList缓慢?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 为什么迭代通过LinkedList缓慢?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1505字,纯文字阅读大概需要3分钟。
内容图文
![java – 为什么迭代通过LinkedList缓慢?](/upload/InfoBanner/zyjiaocheng/757/66f95cd6dcc440f183c3186a287c0da9.jpg)
Java 8
我有一个很大的集合(大约100M元素),我需要迭代它并做一些动作.有两种选择:
>迭代一次并完成整个工作(这会使代码复杂化)
>迭代两次,在第一次迭代中完成一半的工作,在第二次迭代中休息(这将显着简化代码)
所以,我认为迭代不是那么昂贵,并写了一个简单的例子来衡量它(我不经常写基准,因此它可能看起来有点傻):
Collection<Double> col = new LinkedList<>();
for(int i = 0; i < 30000000; i++){
col.add(Math.sqrt(i + 1));
}
long start1 = System.nanoTime();
Double res = 0.0;
for(Double d : col){
res += d + d;
}
long end1 = System.nanoTime();
System.out.println(end1 - start1);
System.out.println("=================================");
long start2 = System.nanoTime();
Double res2 = 0.0;
for(Double d : col){
res2 += d;
}
for(Double d : col){
res2 += d;
}
long end2 = System.nanoTime();
System.out.println(end2 - start2);
平均结果如下:
首先是1107881047
2133450162秒(慢两倍)
因此,迭代是一个非常缓慢的过程.但我不明白为什么?我认为我们的工作量几乎相同,因此性能会有很大差异.
值得注意的是,如果我使用ArrayList而不是链表,结果是:
3858616604首先
422297749其次(比第一个快十倍,比上面的例子快两倍).
难道你不能简单解释一下这种性能差异吗?
解决方法:
首先,对于基准测试,使用JMH tool会更好
现在,到原来的问题.当您迭代ArrayList时,您基本上对数组进行顺序扫描,该数组是一个连续的内存块. CPU可以完美地预取从主内存到CPU缓存的内容.因此它非常快.
在LinkedList的情况下,您必须通过对象引用从一个元素转到另一个元素.通常情况下,每个节点的对象可以驻留在内存中的任何位置.因此,您必须不断地从一个内存位置跳转到完全不相关的内存位置. CPU无法预测,无法从主内存中获取数据.因此,您一直在等待数据.
内容总结
以上是互联网集市为您收集整理的java – 为什么迭代通过LinkedList缓慢?全部内容,希望文章能够帮你解决java – 为什么迭代通过LinkedList缓慢?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。