gpt4 book ai didi

java - 为什么 clone() 是复制数组的最佳方式?

转载 作者:IT老高 更新时间:2023-10-28 21:12:53 26 4
gpt4 key购买 nike

这对我来说是一种耻辱,但我不知道:

You should use clone to copy arrays, because that's generally the fastest way to do it.

正如 Josh Bloch 在此博客中所述:http://www.artima.com/intv/bloch13.html

我一直使用 System.arraycopy(...)。这两种方法都是 native 的,所以可能没有深入了解库的来源,我无法弄清楚为什么会这样。

我的问题很简单: 为什么它是最快的方式?System.arraycopy有什么区别?区别解释here ,但它没有回答为什么 Josh Bloch 认为 clone() 是最快的方法。

最佳答案

我想说明为什么 clone() 是比 System.arraycopy(..) 或其他方法最快的复制数组的方法:

1. clone() 在将源数组复制到目标数组之前不必进行类型检查,如提供的 here .它只是简单地分配新的内存空间并将对象分配给它。另一方面,System.arraycopy(..) 检查类型,然后复制一个数组。

2. clone() 也破坏了优化以消除冗余归零。如您所知,Java 中每个分配的数组都必须使用 0s 或相应的默认值进行初始化。但是,如果 JIT 在创建后立即看到该数组已填充,则可以避免将该数组归零。与使用现有的 0s 或相应的默认值更改副本值相比,这绝对更快。在使用 System.arraycopy(..) 时会花费大量时间来清除和复制已初始化的数组。为此,我执行了一些基准测试。

@BenchmarkMode(Mode.Throughput)
@Fork(1)
@State(Scope.Thread)
@Warmup(iterations = 10, time = 1, batchSize = 1000)
@Measurement(iterations = 10, time = 1, batchSize = 1000)
public class BenchmarkTests {

@Param({"1000","100","10","5", "1"})
private int size;
private int[] original;

@Setup
public void setup() {
original = new int[size];
for (int i = 0; i < size; i++) {
original[i] = i;
}
}

@Benchmark
public int[] SystemArrayCopy() {
final int length = size;
int[] destination = new int[length];
System.arraycopy(original, 0, destination, 0, length);
return destination;
}


@Benchmark
public int[] arrayClone() {
return original.clone();
}

}

输出:

Benchmark                        (size)   Mode  Cnt       Score      Error  Units
ArrayCopy.SystemArrayCopy 1 thrpt 10 26324.251 ± 1532.265 ops/s
ArrayCopy.SystemArrayCopy 5 thrpt 10 26435.562 ± 2537.114 ops/s
ArrayCopy.SystemArrayCopy 10 thrpt 10 27262.200 ± 2145.334 ops/s
ArrayCopy.SystemArrayCopy 100 thrpt 10 10524.117 ± 474.325 ops/s
ArrayCopy.SystemArrayCopy 1000 thrpt 10 984.213 ± 121.934 ops/s
ArrayCopy.arrayClone 1 thrpt 10 55832.672 ± 4521.112 ops/s
ArrayCopy.arrayClone 5 thrpt 10 48174.496 ± 2728.928 ops/s
ArrayCopy.arrayClone 10 thrpt 10 46267.482 ± 4641.747 ops/s
ArrayCopy.arrayClone 100 thrpt 10 19837.480 ± 364.156 ops/s
ArrayCopy.arrayClone 1000 thrpt 10 1841.145 ± 110.322 ops/s

根据我得到的输出, clone 几乎是 System.arraycopy(..)

的两倍

3. 此外,使用像 clone() 这样的手动复制方法会产生更快的输出,因为它不必进行任何 VM 调用(与 System .arraycopy()).

关于java - 为什么 clone() 是复制数组的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46145826/

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