Java 深度拷贝测试

测试抉择了两种深度拷贝的形式

  • Object Stream
  • fast-serialization

fast-serialization 是一个开源的高性能的序列化库。

RuedigerMoeller/fast-serialization

应用 idea 新建一个 maven 我的项目,引入须要的开源工具 JMH 和下面的 fast-serialization。

<dependencies>    <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>4.11</version>      <scope>test</scope>    </dependency>    <dependency>      <groupId>org.openjdk.jmh</groupId>      <artifactId>jmh-core</artifactId>      <version>1.25.2</version>    </dependency>    <dependency>      <groupId>org.openjdk.jmh</groupId>      <artifactId>jmh-generator-annprocess</artifactId>      <version>1.25.2</version>      <scope>provided</scope>    </dependency>    <dependency>      <groupId>de.ruedigermoeller</groupId>      <artifactId>fst</artifactId>      <version>2.57</version>    </dependency><dependencies>

应用 Object Stream 和 fast-serialization 写出两个深度拷贝的办法

public class DeepCopyUtils {    private static FSTConfiguration configuration = FSTConfiguration.createDefaultConfiguration();    public static <T> T fstDeepCopy(T src) {        return configuration.deepCopy(src);    }    public static <T> T deepCopy(T src) {        try {            ByteArrayOutputStream byteOut = new ByteArrayOutputStream();            ObjectOutputStream out = new ObjectOutputStream(byteOut);            out.writeObject(src);            ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());            ObjectInputStream in = new ObjectInputStream(byteIn);            return (T)in.readObject();        } catch ( Exception e) {        }        return null;    }}

应用 JMH 写一个基准测试类

@BenchmarkMode(Mode.Throughput)@Warmup(iterations = 10)@Measurement(iterations = 50, time = 3, timeUnit = TimeUnit.SECONDS)@Threads(8)@Fork(2)@OutputTimeUnit(TimeUnit.MILLISECONDS)public class DeepCopyBenchmark {    private static UserData userData = new UserData();    static {        userData.setBetCoins(1000000L);        List<String> modes = new ArrayList<>();        modes.add("DEEP");        modes.add("COPY");        userData.setModes(modes);        List<Object> storedIcons = new ArrayList<>();        List<Object> icon1 = new ArrayList<>();        icon1.add(1);        icon1.add(new BigDecimal(100));        storedIcons.add(icon1);        userData.setStoredIcon(storedIcons);        userData.setOhter(new Othre());        userData.setUid(1L);    }    @Benchmark    public void testFstDeepCopy() {        DeepCopyUtils.fstDeepCopy(userData);    }    @Benchmark    public void testDeepCopy() {        DeepCopyUtils.deepCopy(userData);    }    }

编写一个运行基准测试方法

public static void main( String[] args ) throws RunnerException {        Options options = new OptionsBuilder()            .include(DeepCopyBenchmark.class.getSimpleName())            .output("/Users/admin/deep_copy_benchmark.log")            .build();        new Runner(options).run();    }

关上输入日志 deep_copy_benchmark.log

Benchmark                           Mode  Cnt     Score    Error   UnitsDeepCopyBenchmark.testDeepCopy     thrpt  100    82.756 ±  2.047  ops/msDeepCopyBenchmark.testFstDeepCopy  thrpt  100  1177.081 ± 11.151  ops/ms

很显著 fast-serialization 强得不是一点半点。