java – 为什么克隆数组这么慢?

前端之家收集整理的这篇文章主要介绍了java – 为什么克隆数组这么慢?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这个测试
  1. for (;;) {
  2. int[] a = new int[10];
  3. System.gc();
  4. long t0 = System.currentTimeMillis();
  5. for (int i = 0; i < 1000000; i++) {
  6. // int[] b = a.clone();
  7. int[] b = Arrays.copyOf(a,a.length);
  8. }
  9. System.out.println(System.currentTimeMillis() - t0);
  10. }

显示Arrays.copyOf约为50ms,克隆显示约160ms.克隆是一种特殊的原生方法来制作副本,为什么它这么慢?

我在HotSpot Client JVM 1.7.0_11-b21上运行测试.请注意,当阵列大小增加时,clone和copyOf之间的差异会消失.

解决方法

我在你的系统上运行你的代码:它们之间几乎没有区别.两者的时钟都在大约30毫秒.我的测试是在OpenJDK 7上进行的.

为了确认我也通过Caliper运行它,并使用更大的数组来强调实际的复制性能

  1. public class Performance extends SimpleBenchmark {
  2. final int[] source = new int[1000];
  3.  
  4. public int timeClone(int reps) {
  5. int sum = 0;
  6. for (int i = reps; i > 0; i--)
  7. sum += source.clone().length;
  8. return sum;
  9. }
  10.  
  11. public int timeCopyOf(int reps) {
  12. int sum = 0;
  13. for (int i = reps; i > 0; i--)
  14. sum += Arrays.copyOf(source,source.length).length;
  15. return sum;
  16. }
  17. public static void main(String... args) {
  18. Runner.main(Performance.class,args);
  19. }
  20. }

结果:

  1. 0% Scenario{vm=java,trial=0,benchmark=Clone} 2141.70 ns; σ=5416.80 ns @ 10 trials
  2. 50% Scenario{vm=java,benchmark=CopyOf} 2168.38 ns; σ=1545.85 ns @ 10 trials
  3.  
  4. benchmark us linear runtime
  5. Clone 2.14 =============================
  6. CopyOf 2.17 ==============================
  7.  
  8. vm: java
  9. trial: 0

根据请求,这里的数组大小为10:

  1. 0% Scenario{vm=java,benchmark=Clone} 30.07 ns; σ=2.12 ns @ 10 trials
  2. 50% Scenario{vm=java,benchmark=CopyOf} 29.34 ns; σ=161.38 ns @ 10 trials
  3.  
  4. benchmark ns linear runtime
  5. Clone 30.1 ==============================
  6. CopyOf 29.3 =============================

猜你在找的Java相关文章