乐趣区

关于java:Java-深度拷贝测试

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   Units
DeepCopyBenchmark.testDeepCopy     thrpt  100    82.756 ±  2.047  ops/ms
DeepCopyBenchmark.testFstDeepCopy  thrpt  100  1177.081 ± 11.151  ops/ms

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

退出移动版