关于List循环性能问题

[复制链接]
查看11 | 回复9 | 2021-1-27 05:27:04 | 显示全部楼层 |阅读模式
今天在看java8流操作时,想测试一下性能。但是突然发现一个问题。具体看下面两张图,为什么只是原始数据list放置的位置不一样。所消耗的时间差那么大?因为放前面时,数据已经被读取到cpu缓存中了?



分 -->
回复

使用道具 举报

千问 | 2021-1-27 05:27:04 | 显示全部楼层
我对这个也很感兴趣,试了一下问题多出来一个。。。

方式一list普通For最终耗时=713(ListnewList1=newArrayList();多了一个初始化操作速度居然还快了。。。)
方式一list2普通For最终耗时=850

回复

使用道具 举报

千问 | 2021-1-27 05:27:04 | 显示全部楼层
因为list插入数据时,会不断扩容/复制,但你第二种方式相当于把扩容的事情都做过一次了,自然就只是插入数据而已,并没有复制扩容操作了,所以快了不少.
你可以尝试修改代码
ListnewList1=newArrayList();
改成
ListnewList1=newArrayList(2000000);
就明白是为啥了
回复

使用道具 举报

千问 | 2021-1-27 05:27:04 | 显示全部楼层
引用2楼maradona1984的回复:因为list插入数据时,会不断扩容/复制,但你第二种方式相当于把扩容的事情都做过一次了,自然就只是插入数据而已,并没有复制扩容操作了,所以快了不少.
你可以尝试修改代码
ListnewList1=newArrayList();
改成
ListnewList1=newArrayList(2000000);
就明白是为啥了


这个我尝试了一下,并没有太大改变:
方式一list普通For最终耗时=723
方式一list2普通For最终耗时=721
回复

使用道具 举报

千问 | 2021-1-27 05:27:04 | 显示全部楼层
publicclassArrayListTest1{
publicstaticvoidmain(String[]args){
//原始List
ListoldList1=newArrayList();
for(inti=0;inewList1=newArrayList(2000000);
for(inti=0;ioldList2=newArrayList();
for(inti=0;ioldList=newArrayList();
for(inti=0;ioldList2=newArrayList();
for(inti=0;inewList1=newArrayList(2000000);
for(inti=0;i引用3楼月光下的大D丶的回复:Quote: 引用2楼maradona1984的回复:
因为list插入数据时,会不断扩容/复制,但你第二种方式相当于把扩容的事情都做过一次了,自然就只是插入数据而已,并没有复制扩容操作了,所以快了不少.
你可以尝试修改代码
ListnewList1=newArrayList();
改成
ListnewList1=newArrayList(2000000);
就明白是为啥了


这个我尝试了一下,并没有太大改变:
方式一list普通For最终耗时=723
方式一list2普通For最终耗时=721

的确挺奇怪
回复

使用道具 举报

千问 | 2021-1-27 05:27:04 | 显示全部楼层
你给出的代码甚至都没有控制唯一变量,不能得出任何结论。
我刚才也跑了几次,结果也是相当不稳定。直接说你想测什么吧。
回复

使用道具 举报

千问 | 2021-1-27 05:27:04 | 显示全部楼层
引用3楼月光下的大D丶的回复:Quote: 引用2楼maradona1984的回复:
因为list插入数据时,会不断扩容/复制,但你第二种方式相当于把扩容的事情都做过一次了,自然就只是插入数据而已,并没有复制扩容操作了,所以快了不少.
你可以尝试修改代码
ListnewList1=newArrayList();
改成
ListnewList1=newArrayList(2000000);
就明白是为啥了


这个我尝试了一下,并没有太大改变:
方式一list普通For最终耗时=723
方式一list2普通For最终耗时=721

结果相当不稳定
回复

使用道具 举报

千问 | 2021-1-27 05:27:04 | 显示全部楼层
引用6楼nayi_224的回复:你给出的代码甚至都没有控制唯一变量,不能得出任何结论。
我刚才也跑了几次,结果也是相当不稳定。直接说你想测什么吧。

就是为什以同样的循环,耗时差那么多?根据我的理解,应该是跟cpu一、二、三级缓存有关,但又不是很确定。
回复

使用道具 举报

千问 | 2021-1-27 05:27:04 | 显示全部楼层
引用2楼maradona1984的回复:因为list插入数据时,会不断扩容/复制,但你第二种方式相当于把扩容的事情都做过一次了,自然就只是插入数据而已,并没有复制扩容操作了,所以快了不少.
你可以尝试修改代码
ListnewList1=newArrayList();
改成
ListnewList1=newArrayList(2000000);
就明白是为啥了

你这说法也说不过去,你看我图,我都是往newList1中add数据。前一次add一百万次733,第二次add187。这个时间相关也太大了吧。具体的你看代码就知道了。
回复

使用道具 举报

千问 | 2021-1-27 05:27:04 | 显示全部楼层
测得次数太少了吧,我执行了好多次,最终结果是时间基本相等,误差大概20%以内。
如果真跟缓存有关,差距十倍以上还差不多
importjava.util.ArrayList;
importjava.util.List;
publicclassTest19{
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
ListoldList1=newArrayList();
for(inti=0;ioldList2=newArrayList();
for(inti=0;inewList1=newArrayList(1000000);
ListnewList2=newArrayList(1000000);
for(inti=0;i
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行