Java数组拷贝效率,为什么我得出的答案和网上不一样?

今天我看了一下数组的拷贝,网上都是说拷贝效率对比
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;itarget[i]=orginal[i];
}
longend_time=System.nanoTime();
System.out.println("使用for循环耗时:"+(end_time-start_time));
}
publicstaticvoidmain(Stringargs[]){
//需要改变原始数组的大小
int[]original=newint[10000000];
for(inti=0;ioriginal[i]=i;
}
System.out.println("原始数组的大小:"+original.length);
testSystemArrayCopy(original);
testArraysCopyOf(original);
testClone(original);
testFor(original);
}
结果:
原始数组的大小:100
使用System.arraycopy方法耗时:8400
使用Arrays.copyOf方法耗时:52100
使用clone方法耗时:6000
使用for循环耗时:3100
for>clone>System.arraycopy>Arrays.copyOf
======================
原始数组的大小:10000
使用System.arraycopy方法耗时:42200
使用Arrays.copyOf方法耗时:123900
使用clone方法耗时:33700
使用for循环耗时:249200
clone>System.arraycopy>Arrays.copyOf>for
=======================
原始数组的大小:1000000
使用System.arraycopy方法耗时:3874700
使用Arrays.copyOf方法耗时:3174500
使用clone方法耗时:2867300
使用for循环耗时:6705100
clone>Arrays.copyOf>System.arraycopy>for
=======================
原始数组的大小:100000000
使用System.arraycopy方法耗时:242847700
使用Arrays.copyOf方法耗时:242949100
使用clone方法耗时:394861500
使用for循环耗时:136803300
for>System.arraycopy≈Arrays.copyOf>clone
实验结果表明:
当数组大小比较小的时候for循环的效率最高,完胜其他方法的效率
当数组大小在1W-100W的时候clone效率最高,System.arraycopy也不差,for循环的效率比较糟糕
当数组大小比较大的时候,1亿for循环效率最高,clone效率最慢
我的问题:为什么的我结论和网上不一样,以及造成这样的原因
小唯快跑啊
浏览 276回答 2
2回答

幕布斯6054654

这样的测试最好用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因为看不到代码所以盲猜也是类似的实现
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript