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