gpt4 book ai didi

java - 为什么克隆阵列这么慢?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:28:11 27 4
gpt4 key购买 nike

这个测试

        for (;;) {
int[] a = new int[10];
System.gc();
long t0 = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
// int[] b = a.clone();
int[] b = Arrays.copyOf(a, a.length);
}
System.out.println(System.currentTimeMillis() - t0);
}

Arrays.copyOf 显示 ~50 毫秒,克隆显示 ~160 毫秒。 Clone是一种特殊的native拷贝方法,为什么这么慢?

我在 HotSpot 客户端 JVM 1.7.0_11-b21 上运行了测试。请注意,当数组的大小增加时,clone 和 copyOf 之间的区别就消失了。

最佳答案

我在我的系统上运行了您的代码:它们之间几乎没有区别。两者都以大约 30 毫秒的速度计时。我的测试是在 OpenJDK 7 上进行的。

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

public class Performance extends SimpleBenchmark {
final int[] source = new int[1000];

public int timeClone(int reps) {
int sum = 0;
for (int i = reps; i > 0; i--)
sum += source.clone().length;
return sum;
}

public int timeCopyOf(int reps) {
int sum = 0;
for (int i = reps; i > 0; i--)
sum += Arrays.copyOf(source,source.length).length;
return sum;
}
public static void main(String... args) {
Runner.main(Performance.class, args);
}
}

结果:

 0% Scenario{vm=java, trial=0, benchmark=Clone} 2141.70 ns; σ=5416.80 ns @ 10 trials
50% Scenario{vm=java, trial=0, benchmark=CopyOf} 2168.38 ns; σ=1545.85 ns @ 10 trials

benchmark us linear runtime
Clone 2.14 =============================
CopyOf 2.17 ==============================

vm: java
trial: 0

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

 0% Scenario{vm=java, trial=0, benchmark=Clone} 30.07 ns; σ=2.12 ns @ 10 trials
50% Scenario{vm=java, trial=0, benchmark=CopyOf} 29.34 ns; σ=161.38 ns @ 10 trials

benchmark ns linear runtime
Clone 30.1 ==============================
CopyOf 29.3 =============================

关于java - 为什么克隆阵列这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14735869/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com