范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

别再写main方法测试了,太Low!这才是专业Java测试方法

  在日常开发中,我们对一些代码的调用或者工具的使用会存在多种选择方式,在不确定他们性能的时候,我们首先想要做的就是去测量它。大多数时候,我们会简单的采用多次计数的方式来测量,来看这个方法的总耗时。
  但是,如果熟悉JVM类加载机制的话,应该知道JVM默认的执行模式是JIT编译与解释混合执行。JVM通过热点代码统计分析,识别高频方法的调用、循环体、公共模块等,基于JIT动态编译技术,会将热点代码转换成机器码,直接交给CPU执行。
  也就是说,JVM会不断的进行编译优化,这就使得很难确定重复多少次才能得到一个稳定的测试结果?所以,很多有经验的同学会在测试代码前写一段预热的逻辑。
  JMH,全称 Java Microbenchmark Harness (微基准测试框架),是专门用于Java代码微基准测试的一套测试工具API,是由 OpenJDK/Oracle 官方发布的工具。何谓 Micro Benchmark 呢?简单地说就是在 method 层面上的 benchmark,精度可以精确到微秒级。
  Java的基准测试需要注意的几个点:  测试前需要预热。  防止无用代码进入测试方法中。  并发测试。  测试结果呈现。
  JMH的使用场景:  定量分析某个热点函数的优化效果  想定量地知道某个函数需要执行多长时间,以及执行时间和输入变量的相关性  对比一个函数的多种实现方式
  本篇主要是介绍JMH的DEMO演示,和常用的注解参数。希望能对你起到帮助。  DEMO 演示
  这里先演示一个DEMO,让不了解JMH的同学能够快速掌握这个工具的大概用法。  1. 测试项目构建
  JMH是内置Java9及之后的版本。这里是以Java8进行说明。
  为了方便,这里直接介绍使用maven构建JMH测试项目的方式。
  第一种是使用命令行构建,在指定目录下执行以下命令:  $ mvn archetype:generate            -DinteractiveMode=false            -DarchetypeGroupId=org.openjdk.jmh            -DarchetypeArtifactId=jmh-java-benchmark-archetype            -DgroupId=org.sample            -DartifactId=test            -Dversion=1.0
  对应目录下会出现一个test项目,打开项目后我们会看到这样的项目结构。
  第二种方式就是直接在现有的maven项目中添加 jmh-core 和jmh-generator-annprocess 的依赖来集成JMH。                 org.openjdk.jmh             jmh-core             ${jmh.version}                               org.openjdk.jmh             jmh-generator-annprocess             ${jmh.version}             provided          2. 编写性能测试
  这里我以测试LinkedList 通过index 方式迭代和foreach 方式迭代的性能差距为例子,编写测试类,涉及到的注解在之后会讲解,  /**  * @author Richard_yyf  * @version 1.0 2019/8/27  */  @State(Scope.Benchmark) @OutputTimeUnit(TimeUnit.SECONDS) @Threads(Threads.MAX) public class LinkedListIterationBenchMark {  private static final int SIZE = 10000;      private List list = new LinkedList<>();          @Setup     public void setUp() {         for (int i = 0; i < SIZE; i++) {             list.add(String.valueOf(i));         }     }      @Benchmark     @BenchmarkMode(Mode.Throughput)     public void forIndexIterate() {         for (int i = 0; i < list.size(); i++) {             list.get(i);             System.out.print("");         }     }      @Benchmark     @BenchmarkMode(Mode.Throughput)     public void forEachIterate() {         for (String s : list) {             System.out.print("");         }     } } 3. 执行测试
  运行  JMH  基准测试有两种方式,一个是生产jar文件运行,另一个是直接写main函数或者放在单元测试中执行。
  生成jar文件的形式主要是针对一些比较大的测试,可能对机器性能或者真实环境模拟有一些需求,需要将测试方法写好了放在linux环境执行。具体命令如下  $ mvn clean install $ java -jar target/benchmarks.jar
  我们日常中遇到的一般是一些小测试,比如我上面写的例子,直接在IDE中跑就好了。启动方式如下:   public static void main(String[] args) throws RunnerException {         Options opt = new OptionsBuilder()                 .include(LinkedListIterationBenchMark.class.getSimpleName())                 .forks(1)                 .warmupIterations(2)                 .measurementIterations(2)              .output("E:/Benchmark.log")                 .build();          new Runner(opt).run();     } 4. 报告结果
  输出结果如下,
  最后的结果:  Benchmark                                      Mode  Cnt     Score   Error  Units LinkedListIterationBenchMark.forEachIterate   thrpt    2  1192.380          ops/s LinkedListIterationBenchMark.forIndexIterate  thrpt    2   206.866          ops/s
  整个过程:  # Detecting actual CPU count: 12 detected # JMH version: 1.21 # VM version: JDK 1.8.0_131, Java HotSpot(TM) 64-Bit Server VM, 25.131-b11 # VM invoker: C:Program FilesJavajdk1.8.0_131jrebinjava.exe # VM options: -javaagent:D:Program FilesJetBrainsIntelliJ IDEA 2018.2.2libidea_rt.jar=65175:D:Program FilesJetBrainsIntelliJ IDEA 2018.2.2bin -Dfile.encoding=UTF-8 # Warmup: 2 iterations, 10 s each # Measurement: 2 iterations, 10 s each # Timeout: 10 min per iteration # Threads: 12 threads, will synchronize iterations # Benchmark mode: Throughput, ops/time # Benchmark: org.sample.jmh.LinkedListIterationBenchMark.forEachIterate  # Run progress: 0.00% complete, ETA 00:01:20 # Fork: 1 of 1 # Warmup Iteration   1: 1189.267 ops/s # Warmup Iteration   2: 1197.321 ops/s Iteration   1: 1193.062 ops/s Iteration   2: 1191.698 ops/s   Result "org.sample.jmh.LinkedListIterationBenchMark.forEachIterate":   1192.380 ops/s   # JMH version: 1.21 # VM version: JDK 1.8.0_131, Java HotSpot(TM) 64-Bit Server VM, 25.131-b11 # VM invoker: C:Program FilesJavajdk1.8.0_131jrebinjava.exe # VM options: -javaagent:D:Program FilesJetBrainsIntelliJ IDEA 2018.2.2libidea_rt.jar=65175:D:Program FilesJetBrainsIntelliJ IDEA 2018.2.2bin -Dfile.encoding=UTF-8 # Warmup: 2 iterations, 10 s each # Measurement: 2 iterations, 10 s each # Timeout: 10 min per iteration # Threads: 12 threads, will synchronize iterations # Benchmark mode: Throughput, ops/time # Benchmark: org.sample.jmh.LinkedListIterationBenchMark.forIndexIterate  # Run progress: 50.00% complete, ETA 00:00:40 # Fork: 1 of 1 # Warmup Iteration   1: 205.676 ops/s # Warmup Iteration   2: 206.512 ops/s Iteration   1: 206.542 ops/s Iteration   2: 207.189 ops/s   Result "org.sample.jmh.LinkedListIterationBenchMark.forIndexIterate":   206.866 ops/s   # Run complete. Total time: 00:01:21  REMEMBER: The numbers below are just data. To gain reusable insights, you need to follow up on why the numbers are the way they are. Use profilers (see -prof, -lprof), design factorial experiments, perform baseline and negative tests that provide experimental control, make sure the benchmarking environment is safe on JVM/OS/HW level, ask for reviews from the domain experts. Do not assume the numbers tell you what you want them to tell.  Benchmark                                      Mode  Cnt     Score   Error  Units LinkedListIterationBenchMark.forEachIterate   thrpt    2  1192.380          ops/s LinkedListIterationBenchMark.forIndexIterate  thrpt    2   206.866          ops/s 注解介绍
  下面我们来详细介绍一下相关的注解,  @BenchmarkMode
  微基准测试类型。 JMH  提供了以下几种类型进行支持:
  类型描述  Throughput每段时间执行的次数,一般是秒 AverageTime平均时间,每次操作的平均耗时  SampleTime在测试中,随机进行采样执行的时间 SingleShotTime在每次执行中计算耗时  All所有模式
  可以注释在方法级别,也可以注释在类级别,  @BenchmarkMode(Mode.All) public class LinkedListIterationBenchMark {  ... } @Benchmark @BenchmarkMode({Mode.Throughput, Mode.SingleShotTime}) public void m() {  ... } @Warmup
  这个单词的意思就是预热, iterations = 3 就是指预热轮数。 @Benchmark @BenchmarkMode({Mode.Throughput, Mode.SingleShotTime}) @Warmup(iterations = 3) public void m() {  ... } @Measurement
  正式度量计算的轮数。  iterations  进行测试的轮次 time  每轮进行的时长 timeUnit 时长单位 @Benchmark @BenchmarkMode({Mode.Throughput, Mode.SingleShotTime}) @Measurement(iterations = 3) public void m() {  ... } @Threads
  每个进程中的测试线程。  @Threads(Threads.MAX) public class LinkedListIterationBenchMark {  ... } @Fork
  进行 fork 的次数。如果 fork 数是3的话,则 JMH 会 fork 出3个进程来进行测试。  @Benchmark @BenchmarkMode({Mode.Throughput, Mode.SingleShotTime}) @Fork(value = 3) public void m() {  ... } @OutputTimeUnit
  基准测试结果的时间类型。一般选择秒、毫秒、微秒。  @OutputTimeUnit(TimeUnit.SECONDS) public class LinkedListIterationBenchMark {  ... } @Benchmark
  方法级注解,表示该方法是需要进行 benchmark 的对象,用法和 JUnit 的  @Test  类似。 @Param
  属性级注解, @Param  可以用来指定某项参数的多种情况。特别适合用来测试一个函数在不同的参数输入的情况下的性能。 @Setup
  方法级注解,这个注解的作用就是我们需要在测试之前进行一些 准备工作 ,比如对一些数据的初始化之类的。  @TearDown
  方法级注解,这个注解的作用就是我们需要在测试之后进行一些 结束工作 ,比如关闭线程池,数据库连接等的,主要用于资源的回收等。  @State
  当使用 @Setup 参数的时候,必须在类上加这个参数,不然会提示无法运行。
  就比如我上面的例子中,就必须设置 state 。
  State  用于声明某个类是一个"状态",然后接受一个 Scope 参数用来表示该状态的共享范围。因为很多 benchmark 会需要一些表示状态的类,JMH 允许你把这些类以依赖注入的方式注入到 benchmark 函数里。Scope 主要分为三种。 Thread: 该状态为每个线程独享。  Group: 该状态为同一个组里面所有线程共享。  Benchmark: 该状态在所有线程间共享。  启动方法
  在启动方法中,可以直接指定上述说到的一些参数,并且能将测试结果输出到指定文件中,    /**      * 仅限于IDE中运行      * 命令行模式 则是 build 然后 java -jar 启动      *      * 1. 这是benchmark 启动的入口      * 2. 这里同时还完成了JMH测试的一些配置工作      * 3. 默认场景下,JMH会去找寻标注了@Benchmark的方法,可以通过include和exclude两个方法来完成包含以及排除的语义      */     public static void main(String[] args) throws RunnerException {         Options opt = new OptionsBuilder()                 // 包含语义                 // 可以用方法名,也可以用XXX.class.getSimpleName()                 .include("Helloworld")                 // 排除语义                 .exclude("Pref")                 // 预热10轮                 .warmupIterations(10)                 // 代表正式计量测试做10轮,                 // 而每次都是先执行完预热再执行正式计量,                 // 内容都是调用标注了@Benchmark的代码。                 .measurementIterations(10)                 //  forks(3)指的是做3轮测试,                 // 因为一次测试无法有效的代表结果,                 // 所以通过3轮测试较为全面的测试,                 // 而每一轮都是先预热,再正式计量。                 .forks(3)              .output("E:/Benchmark.log")                 .build();          new Runner(opt).run();     }  结语
  基于JMH可以对很多工具和框架进行测试,比如日志框架性能对比、BeanCopy性能对比 等,更多的example可以参考官方给出的JMH samples (https://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/)

柯尼卡美能达XP系统驱动安装柯尼卡美能达复合机驱动程序安装指南(WindowsXP适用)从桌面开始设置打印机和传真点击右上方的添加打印机只选择连接到此计算机的本地打印机下一步到选择打印机端口的界面选择创建新端小米冲高,米粉退烧2020年以来,雷军多次公开谈及小米不被理解。背后的原因是,近些年小米一直在冲击高端品牌,这在很多人看来基本是不可能完成的任务。一位已经脱粉的用户看法是,其实很大一部分不理解都集中做网站要屏蔽的一些爬虫,这些爬虫蜘蛛可能会导致你的网站崩溃我朋友的一个网站经常打不开,说要经常重启服务器才能正常访问,他觉得是被什么人攻击了,让我帮他看一下。结果经过了一番排除之后才知道,原来是有很多未知的爬虫蜘蛛大量抓取网站页面所导致的保时捷全能电动车款2019年,保时捷(Porsche)推出首款纯电动跑车Taycan,被视为车界最佳之一。全新的TaycanCrossTurismo更进一步成为全能电动高手,让人留下深刻印象。保时捷联想小新Padplus入手一个月真实感受为码字买赵非凡是一名在校大学生,虽然学的是理工科,但他一直有一个作家梦。互联网高度发达给了他实现作家梦的机会,他尝试在网络平台上连载小说。没曾想,他还有些写小说的天赋,第一本玄幻小说就签约人间芳菲四月的手机圈看了这几天的手机发布会,又看了看即将召开的手机发布会宣传,手机圈这日子真充实呀!怎么个充实法?你请看4月19日周二1908Hinova9se新品发布会。同天,1930魅族春日新品观芯片短缺京东方iPhoneOLED生产中断中国的京东方正处于危机之中。由于芯片短缺,苹果的iPhoneOLED生产已中断数月,LCD价格持续下滑。据市场研究公司UBIResearch和业界21日消息,京东方预计将在下个月之国内的中端手机开始疯狂的内卷模式,消费者可选择会变得更多今天小米还有一加纷纷发布了自己的中端手机,在高端市场销量都上不去的情况下,中端市场就成了国内手机的必争之地。谁能占据中端市场的销量谁就占据了主要的市场份额。因为对于绝大多数的普通老如果现在必须要你换一个品牌的手机,你会选择哪个牌子?我现在使用的是魅族手机,是从m8时代就开始的,一直用到现在,在此之前使用的是诺基亚手机,基本上从用手机开始就用过这两个牌子的,也算专一了。如题所说,如果非要换一个品牌手机不可的话,12万8888,最便宜L4无人配送车买回家知一发自副驾寺智能车参考公众号AI4Auto有市场需求,现在也有售价。在上海疫情中雪中送炭被重新认知的无人驾驶配送车,最新款的售价公布人民币12。8888万。不仅是有史以来无人配送或是当前最便宜的双曲面屏手机!2299元起,小米Civi1S这三项很强在小米Civi1S发布之后,有两种声音非常突出一个是关心产品经理,毕竟确实颜值很高,而且这次请来了奥运冠军杨倩。另一种声音,则是关心更加出色的自拍功能,全新的眼部追焦4D光追美妆焕
腾讯清仓式减持京东马化腾放弃刘强东是何原因?腾讯阿里已形成两大投资阵营,不过目前并未明确要求腾讯进行拆分,腾讯此次做出退出京东的决定一定程度上基于避险的考虑。12月23日上午,腾讯控股(0700。HK)在港交所发布公告,将以特斯拉陶琳芯片人工智能等成为了新的卡脖子领域新京报贝壳财经讯(记者林子)日前,特斯拉全球副总裁陶琳在接受新京报贝壳财经看2022专访时表示,自主品牌在新局面中需要以产品和技术冲高,同时在整车制造供应链资金链等方面有优势,有利健康饮水如此简单,净水即热两不误,我用一台魔凡净饮机就搞定空气质量和饮水健康,应该是目前稍微有点生活品质讲究的人都会在意的问题。前者在近两年的变化非常大,随着碳中和归零的期限越来越近,我们家已经有近一年没有开空气净化器了。后者的水健康一直用FILE函数给文本文件排序1。将一个随机数写到一个文本文件中defineCRTSECURENOWARNINGSincludestdio。hincludestring。hincludestdlib。hincl手机外接摄像头的效果怎么样?当然好。买个微单还专业效果是有的,而且就算在某宝上随便买个几十块钱的外挂镜头拍照效果也是很不错的。但是这东西弊大于利,首先一个,手机拍照本来就是以便携为主,在手机上加上一个外接镜头文字识别的效果如何?如果想要文字识别,最快捷方便的方法是微信搜索文字识别助理小程序。无需安装,只需微信内找到这款小程序即可扫描识别文字。我还试用过蛮多这种小程序的,觉得这款比较好的原因是它没有广告,页Vue3和Vue2的组件通信方式,建议收藏大佬镇楼先来看看Vue3的几种组件通信方式propsemitexposerefattrsvmodelprovideinjectVuex下面分别介绍这几种方式的写法1props父组件相互宝即将关停,为什么不能长期存在,个人互助保险保健康呢?2018年相互宝上线,最早是以相互保的创新保险产品出现,后来因为这个产品设计不符合保监会的保险产品要求,在后面进行整改,变成了现在的相互宝,也就是大型的网络互助平台,但是仍然是由原相互宝,以行慈善的名义成功割韭菜相互宝,单方面发布了一个公告,就彻底关门大吉,成功金蝉脱壳,留下韭菜们无限遐想,或自我安慰,或隔空骂娘我用相互宝三年,看着它扣费一年年水涨船高,胃口越来越大。谁知道它这一路不断变身什么东西能去除房间里面严重的烟味?要去除房间内的烟味,必须得标本同治一,治本。抽烟人自觉戒烟或禁止在房间内抽烟。清除房间内的烟灰缸烟头烟壶旱烟锅水烟筒等烟味扩散物。重新粉刷被烟熏黄的墙壁。二,治标1,白醋熏蒸法。材8核变4核!欧拉汽车被诉偷换汽车芯片涉嫌欺诈,网友不要让支持国产的消费者失望中国经济周刊经济网讯据央视财经报道,上海市的周女士,11月份购买了一部欧拉好猫新能源车,最吸引她的是品牌方宣称的搭载了高通八核车载芯片,能实现丰富的车载功能。而周女士提车后发现,欧