为了账号安全,请及时绑定邮箱和手机立即绑定

请各位大佬指点!Java数组拷贝效率,为什么我得出的答案和网上不一样?跪求!

请各位大佬指点!Java数组拷贝效率,为什么我得出的答案和网上不一样?跪求!

天涯尽头无女友 2019-09-08 22:08:21
今天我看了一下数组的拷贝,网上都是说拷贝效率对比System.arraycopy()>Arrays.copyOf>clone>for但我实验了之后结果并不是这样,我想知道为什么会造成这样的原因?代码:publicstaticvoidtestSystemArrayCopy(int[]orginal){longstart_time=System.nanoTime();int[]target=newint[orginal.length];System.arraycopy(orginal,0,target,0,target.length);longend_time=System.nanoTime();System.out.println("使用System.arraycopy方法耗时:"+(end_time-start_time));}publicstaticvoidtestArraysCopyOf(int[]orginal){longstart_time=System.nanoTime();int[]target=Arrays.copyOf(orginal,orginal.length);longend_time=System.nanoTime();System.out.println("使用Arrays.copyOf方法耗时:"+(end_time-start_time));}publicstaticvoidtestClone(int[]orginal){longstart_time=System.nanoTime();int[]target=orginal.clone();longend_time=System.nanoTime();System.out.println("使用clone方法耗时:"+(end_time-start_time));}publicstaticvoidtestFor(int[]orginal){longstart_time=System.nanoTime();int[]target=newint[orginal.length];for(inti=0;iSystem.arraycopy>Arrays.copyOf======================原始数组的大小:10000使用System.arraycopy方法耗时:42200使用Arrays.copyOf方法耗时:123900使用clone方法耗时:33700使用for循环耗时:249200clone>System.arraycopy>Arrays.copyOf>for=======================原始数组的大小:1000000使用System.arraycopy方法耗时:3874700使用Arrays.copyOf方法耗时:3174500使用clone方法耗时:2867300使用for循环耗时:6705100clone>Arrays.copyOf>System.arraycopy>for=======================原始数组的大小:100000000使用System.arraycopy方法耗时:242847700使用Arrays.copyOf方法耗时:242949100使用clone方法耗时:394861500使用for循环耗时:136803300for>System.arraycopy≈Arrays.copyOf>clone实验结果表明:当数组大小比较小的时候for循环的效率最高,完胜其他方法的效率当数组大小在1W-100W的时候clone效率最高,System.arraycopy也不差,for循环的效率比较糟糕当数组大小比较大的时候,1亿for循环效率最高,clone效率最慢我的问题:为什么的我结论和网上不一样,以及造成这样的原因
查看完整描述

2 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

这样的测试最好用jmh来做于是我写了一个测试,用长度0,1,2,4,8,16,64,256,1024,1024*1024的byte[]分别测四种复制方法的吞吐量(越大越好),15秒预热,10秒测量,测两轮,结果大概是这样的(各组按照从快到慢的顺序排序):
BenchmarkModeCntScoreErrorUnits
array0SystemCopythrpt20314675.886±936.036ops/ms
array0ArraysCopythrpt20312555.083±2927.650ops/ms
array0ForLoopthrpt20312199.273±4183.104ops/ms
array0Clonethrpt20214478.961±421.628ops/ms
array1ForLoopthrpt20258703.707±940.685ops/ms
array1SystemCopythrpt20194942.177±382.662ops/ms
array1Clonethrpt20194937.877±344.930ops/ms
array1ArraysCopythrpt20194607.121±949.278ops/ms
array2ForLoopthrpt20240467.096±1485.911ops/ms
array2SystemCopythrpt20195098.045±520.939ops/ms
array2Clonethrpt20194804.366±831.149ops/ms
array2ArraysCopythrpt20194747.743±442.115ops/ms
array4ForLoopthrpt20212128.126±842.421ops/ms
array4Clonethrpt20194893.477±374.829ops/ms
array4SystemCopythrpt20194547.102±1301.595ops/ms
array4ArraysCopythrpt20194532.113±751.609ops/ms
array8SystemCopythrpt20194789.870±580.952ops/ms
array8ArraysCopythrpt20194756.009±390.458ops/ms
array8Clonethrpt20194300.107±1013.889ops/ms
array8ForLoopthrpt20171056.354±640.645ops/ms
array16ArraysCopythrpt20187372.689±296.296ops/ms
array16SystemCopythrpt20187274.660±444.482ops/ms
array16Clonethrpt20186272.644±1910.138ops/ms
array16ForLoopthrpt20117366.002±2753.701ops/ms
array64Clonethrpt20131972.165±294.271ops/ms
array64ArraysCopythrpt20131970.417±312.744ops/ms
array64SystemCopythrpt20131631.054±693.137ops/ms
array64ForLoopthrpt2073172.782±285.508ops/ms
array256Clonethrpt2049578.672±92.802ops/ms
array256SystemCopythrpt2049537.817±514.318ops/ms
array256ArraysCopythrpt2049477.653±377.154ops/ms
array256ForLoopthrpt2024637.253±225.039ops/ms
array1024Clonethrpt2013042.147±82.129ops/ms
array1024ArraysCopythrpt2013036.492±99.095ops/ms
array1024SystemCopythrpt2013015.679±87.283ops/ms
array1024ForLoopthrpt206902.488±22.211ops/ms
array10241024Clonethrpt2013.685±0.064ops/ms
array10241024SystemCopythrpt2013.664±0.066ops/ms
array10241024ArraysCopythrpt2013.616±0.098ops/ms
array10241024ForLoopthrpt206.875±0.103ops/ms
结论是对于很小的数组,for循环的方式略快一些,但是只要数组大一些,for循环就是最慢的,剩下三种方法除了空数组的时候clone有些慢之外,没有明显差距
Arrays.copyOf内部调用了System.arrayCopy,理论上慢一丢丢,至于clone因为看不到代码所以盲猜也是类似的实现
                            
查看完整回答
反对 回复 2019-09-08
  • 2 回答
  • 0 关注
  • 287 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信