ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java 深度拷贝测试

2021-05-18 18:01:17  阅读:232  来源: 互联网

标签:userData Java fast static 测试 serialization new 拷贝 public


测试选择了两种深度拷贝的方式

  • 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 强得不是一点半点。

标签:userData,Java,fast,static,测试,serialization,new,拷贝,public
来源: https://www.cnblogs.com/simeone-xu/p/14782089.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有