今天我看了一下数组的拷贝,网上都是说拷贝效率对比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秒测量,测两轮,结果大概是这样的(各组按照从快到慢的顺序排序):BenchmarkModeCntScoreErrorUnitsarray0SystemCopythrpt20314675.886±936.036ops/msarray0ArraysCopythrpt20312555.083±2927.650ops/msarray0ForLoopthrpt20312199.273±4183.104ops/msarray0Clonethrpt20214478.961±421.628ops/msarray1ForLoopthrpt20258703.707±940.685ops/msarray1SystemCopythrpt20194942.177±382.662ops/msarray1Clonethrpt20194937.877±344.930ops/msarray1ArraysCopythrpt20194607.121±949.278ops/msarray2ForLoopthrpt20240467.096±1485.911ops/msarray2SystemCopythrpt20195098.045±520.939ops/msarray2Clonethrpt20194804.366±831.149ops/msarray2ArraysCopythrpt20194747.743±442.115ops/msarray4ForLoopthrpt20212128.126±842.421ops/msarray4Clonethrpt20194893.477±374.829ops/msarray4SystemCopythrpt20194547.102±1301.595ops/msarray4ArraysCopythrpt20194532.113±751.609ops/msarray8SystemCopythrpt20194789.870±580.952ops/msarray8ArraysCopythrpt20194756.009±390.458ops/msarray8Clonethrpt20194300.107±1013.889ops/msarray8ForLoopthrpt20171056.354±640.645ops/msarray16ArraysCopythrpt20187372.689±296.296ops/msarray16SystemCopythrpt20187274.660±444.482ops/msarray16Clonethrpt20186272.644±1910.138ops/msarray16ForLoopthrpt20117366.002±2753.701ops/msarray64Clonethrpt20131972.165±294.271ops/msarray64ArraysCopythrpt20131970.417±312.744ops/msarray64SystemCopythrpt20131631.054±693.137ops/msarray64ForLoopthrpt2073172.782±285.508ops/msarray256Clonethrpt2049578.672±92.802ops/msarray256SystemCopythrpt2049537.817±514.318ops/msarray256ArraysCopythrpt2049477.653±377.154ops/msarray256ForLoopthrpt2024637.253±225.039ops/msarray1024Clonethrpt2013042.147±82.129ops/msarray1024ArraysCopythrpt2013036.492±99.095ops/msarray1024SystemCopythrpt2013015.679±87.283ops/msarray1024ForLoopthrpt206902.488±22.211ops/msarray10241024Clonethrpt2013.685±0.064ops/msarray10241024SystemCopythrpt2013.664±0.066ops/msarray10241024ArraysCopythrpt2013.616±0.098ops/msarray10241024ForLoopthrpt206.875±0.103ops/ms结论是对于很小的数组,for循环的方式略快一些,但是只要数组大一些,for循环就是最慢的,剩下三种方法除了空数组的时候clone有些慢之外,没有明显差距Arrays.copyOf内部调用了System.arrayCopy,理论上慢一丢丢,至于clone因为看不到代码所以盲猜也是类似的实现
添加回答
举报
0/150
提交
取消