摘要:背景許多時候需要對比不同的框架或工具或算法,選擇使用性能更優的那一個。通常的做法是但這樣的做法非常不嚴謹,因為當獨立頻繁運行這一小塊代碼時,可能會針對性的做一些優化工作,而在實際的生產環境中是不會有此優化的。
背景
許多時候需要對比不同的框架或工具或算法, 選擇使用性能更優的那一個。通常的做法是
long start = System.currentTimeMillis(); for(int i=0; i但這樣的做法非常不嚴謹, 因為當獨立頻繁運行這一小塊代碼時,Jvm可能會針對性的做一些優化工作, 而在實際的生產環境中是不會有此優化的。 如一個Jvm優化的例子
原始代碼
int a = 1; int b = 2; int sum = a + b; return sum;可能直接優化為
return 3;所以最好使用更嚴謹的工具 來進行benchmark的工作,
Microbenchmarkings tools are intended to bring the JVM in "stable" state prior to executing tests and run your test suite for sufficient amount of time to get statistically proven evidence of the results.
摘自:http://www.buzdin.lv/2011/01/...而jmh就是這么一個工具
jmh使用示例JMH is short for Java Microbenchmark Harness. JMH is a toolkit that helps you implement Java microbenchmarks correctly. JMH is developed by the same people who implement the Java virtual machine, so these guys know what they are doing.
使用jmh來對比BeanUtils和BeanCopier
代碼
@State(Scope.Thread) public class CopyPropertiesBenchmark { private UserModel model = new UserModel(); private BeanCopier beanCopier = BeanCopier.create(UserModel.class, UserVo.class, false); /** * 人工setter復制屬性 * * @return */ @Benchmark public UserVo manuallySetter() { UserVo vo = new UserVo(); vo.setAvatar(model.getAvatar()); vo.setNick(model.getNick()); // ... return vo; } @Benchmark public UserVo beanUitls() { UserVo vo = new UserVo(); BeanUtils.copyProperties(this.model, vo); return vo; } @Benchmark public UserVo beanCopier() { UserVo vo = new UserVo(); beanCopier.copy(this.model, vo, null); return vo; } }運行結果
# JMH 1.14.1 (released 5 days ago) # VM version: JDK 1.8.0_91, VM 25.91-b14 # VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home/jre/bin/java # VM options: -server # Warmup: 5 iterations, 1 s each # Measurement: 5 iterations, 1 s each # Timeout: 10 min per iteration # Threads: 1 thread, will synchronize iterations # Benchmark mode: Throughput, ops/time # Benchmark: com.zhugw.CopyPropertiesBenchmark.beanCopier # Run progress: 0.00% complete, ETA 00:00:30 # Fork: 1 of 1 # Warmup Iteration 1: 70737107.801 ops/s # Warmup Iteration 2: 63704495.294 ops/s # Warmup Iteration 3: 112706026.910 ops/s # Warmup Iteration 4: 113979995.875 ops/s # Warmup Iteration 5: 114595368.349 ops/s Iteration 1: 113207053.036 ops/s Iteration 2: 111641520.705 ops/s Iteration 3: 111258060.492 ops/s Iteration 4: 110293317.399 ops/s Iteration 5: 110773170.278 ops/s Result "beanCopier": 111434624.382 ±(99.9%) 4285987.844 ops/s [Average] (min, avg, max) = (110293317.399, 111434624.382, 113207053.036), stdev = 1113057.432 CI (99.9%): [107148636.538, 115720612.226] (assumes normal distribution) ... # Run complete. Total time: 00:00:32 Benchmark Mode Cnt Score Error Units CopyPropertiesBenchmark.beanCopier thrpt 5 111434624.382 ± 4285987.844 ops/s CopyPropertiesBenchmark.beanUitls thrpt 5 2451858.127 ± 525264.183 ops/s CopyPropertiesBenchmark.manuallySetter thrpt 5 103524264.901 ± 17644747.083 ops/s從上面的結果可知BeanCopier的性能優于BeanUtils, 吞吐量差距約為45倍。
參考文檔http://tutorials.jenkov.com/j...
http://nitschinger.at/Using-J...
http://hg.openjdk.java.net/co...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66065.html
摘要:于是我建議這位小伙伴使用了進行屬性拷貝,這為我們的程序挖了一個坑阿里代碼規約當我們開啟阿里代碼掃描插件時,如果你使用了進行屬性拷貝,它會給你一個非常嚴重的警告。大名鼎鼎的提供的包,居然會存在性能問題,以致于阿里給出了嚴重的警告。 聲明:本文屬原創文章,始發于公號:程序員自學之道,并同步發布于 https://blog.csdn.net/dadiyang,特此,同步發布到 sf,轉載請注...
摘要:前言作為一名全干打字員,干活時經常會被要求使用各種各樣的語言去實現各種各樣的需求,來回切換起來寫的代碼就會或多或少有點不規范。今天我們以為例,講講在代碼中,我們需要注意的某些規范。 前言 作為一名全干打字員,干活時經常會被要求使用各種各樣的語言去實現各種各樣的需求,來回切換起來寫的代碼就會或多或少有點不規范。今天我們以JAVA為例,講講在代碼中,我們需要注意的某些規范。(本文標準依賴于...
摘要:性能大比拼簡介拷貝在工作中被大量使用,可以大幅度的提高工作量。本文對常用的工具進行了壓力測試,方便大家選擇更加適合自己的工具。本篇文章是增強介紹續篇,該專欄會持續更新,感興趣的朋友請訂閱我們。的表現反而比更好,可能是模型不一樣導致的。 Java Bean Copy 性能大比拼 簡介 Bean 拷貝在工作中被大量使用,可以大幅度的提高工作量。本文對常用的 Bean copy 工具進行了...
閱讀 2624·2021-11-18 10:07
閱讀 1083·2021-08-03 14:04
閱讀 726·2019-08-30 13:08
閱讀 2579·2019-08-29 15:33
閱讀 1087·2019-08-29 14:07
閱讀 2985·2019-08-29 14:04
閱讀 1435·2019-08-29 11:19
閱讀 1144·2019-08-29 10:59