java测试netty_《Netty官方文档》基准测试

原文链接  译者:lijunshu

Netty有一个模块叫’netty-microbench’,我们可以用他来执行一系列的微型基准测试。Netty-microbench是基于OpenJDK JMH构件的(HotSpot的推荐基准测试方案)。当你开始netty基准测试时,你不需要额外的依赖。

运行基准测试

你可以通过maven 命令行或者直接从IDE开始你的基准测试,如果以默认设置开始跑测试,你可以使用命令行mvn -DskipTests=false。我们设置skipTests=false 是因为我们不想以单元测试的方式去运行这些基准测试。

如果没有问题,你将为看到JMH开始warmup然后基于fork数量来运行基准测试,并提供给你漂亮的报告。你会看到一般情况下基准测试的结果如下。

# Fork: 2 of 2

# Warmup: 10 iterations, 1 s each

# Measurement: 10 iterations, 1 s each

# Threads: 1 thread, will synchronize iterations

# Benchmark mode: Throughput, ops/time

# Running: io.netty.microbench.buffer.ByteBufAllocatorBenchmark.pooledDirectAllocAndFree_1_0

# Warmup Iteration   1: 8454.103 ops/ms

# Warmup Iteration   2: 11551.524 ops/ms

# Warmup Iteration   3: 11677.575 ops/ms

# Warmup Iteration   4: 11404.954 ops/ms

# Warmup Iteration   5: 11553.299 ops/ms

# Warmup Iteration   6: 11514.766 ops/ms

# Warmup Iteration   7: 11661.768 ops/ms

# Warmup Iteration   8: 11667.577 ops/ms

# Warmup Iteration   9: 11551.240 ops/ms

# Warmup Iteration  10: 11692.991 ops/ms

Iteration   1: 11633.877 ops/ms

Iteration   2: 11740.063 ops/ms

Iteration   3: 11751.798 ops/ms

Iteration   4: 11260.071 ops/ms

Iteration   5: 11461.010 ops/ms

Iteration   6: 11642.912 ops/ms

Iteration   7: 11808.595 ops/ms

Iteration   8: 11683.780 ops/ms

Iteration   9: 11750.292 ops/ms

Iteration  10: 11769.986 ops/ms

Result : 11650.238 ±(99.9%) 229.698 ops/ms

Statistics: (min, avg, max) = (11260.071, 11650.238, 11808.595), stdev = 169.080

Confidence interval (99.9%): [11420.540, 11879.937]

最终,你的测试结果看上去和这个相似,这个更多的取决于你的系统配置。

Benchmark                                                                Mode   Samples         Mean   Mean error    Units

i.n.m.b.ByteBufAllocatorBenchmark.pooledDirectAllocAndFree_1_0          thrpt        20    11658.812      120.728   ops/ms

i.n.m.b.ByteBufAllocatorBenchmark.pooledDirectAllocAndFree_2_256        thrpt        20    10308.626      147.528   ops/ms

i.n.m.b.ByteBufAllocatorBenchmark.pooledDirectAllocAndFree_3_1024       thrpt        20     8855.815       55.933   ops/ms

i.n.m.b.ByteBufAllocatorBenchmark.pooledDirectAllocAndFree_4_4096       thrpt        20     5545.538     1279.721   ops/ms

i.n.m.b.ByteBufAllocatorBenchmark.pooledDirectAllocAndFree_5_16384      thrpt        20     6741.581       75.975   ops/ms

i.n.m.b.ByteBufAllocatorBenchmark.pooledDirectAllocAndFree_6_65536      thrpt        20     7252.869       70.609   ops/ms

i.n.m.b.ByteBufAllocatorBenchmark.pooledHeapAllocAndFree_1_0            thrpt        20     9750.225       73.900   ops/ms

i.n.m.b.ByteBufAllocatorBenchmark.pooledHeapAllocAndFree_2_256          thrpt        20     9936.639      657.818   ops/ms

i.n.m.b.ByteBufAllocatorBenchmark.pooledHeapAllocAndFree_3_1024         thrpt        20     8903.130      197.533   ops/ms

i.n.m.b.ByteBufAllocatorBenchmark.pooledHeapAllocAndFree_4_4096         thrpt        20     6664.157       74.163   ops/ms

i.n.m.b.ByteBufAllocatorBenchmark.pooledHeapAllocAndFree_5_16384        thrpt        20     6374.924      337.869   ops/ms

i.n.m.b.ByteBufAllocatorBenchmark.pooledHeapAllocAndFree_6_65536        thrpt        20     6386.337       44.960   ops/ms

i.n.m.b.ByteBufAllocatorBenchmark.unpooledDirectAllocAndFree_1_0        thrpt        20     2137.241       30.792   ops/ms

i.n.m.b.ByteBufAllocatorBenchmark.unpooledDirectAllocAndFree_2_256      thrpt        20     1873.727       41.843   ops/ms

i.n.m.b.ByteBufAllocatorBenchmark.unpooledDirectAllocAndFree_3_1024     thrpt        20     1902.025       34.473   ops/ms

i.n.m.b.ByteBufAllocatorBenchmark.unpooledDirectAllocAndFree_4_4096     thrpt        20     1534.347       20.509   ops/ms

i.n.m.b.ByteBufAllocatorBenchmark.unpooledDirectAllocAndFree_5_16384    thrpt        20      838.804       12.575   ops/ms

i.n.m.b.ByteBufAllocatorBenchmark.unpooledDirectAllocAndFree_6_65536    thrpt        20      276.976        3.021   ops/ms

i.n.m.b.ByteBufAllocatorBenchmark.unpooledHeapAllocAndFree_1_0          thrpt        20    35820.568      259.187   ops/ms

i.n.m.b.ByteBufAllocatorBenchmark.unpooledHeapAllocAndFree_2_256        thrpt        20    19660.951      295.012   ops/ms

i.n.m.b.ByteBufAllocatorBenchmark.unpooledHeapAllocAndFree_3_1024       thrpt        20     6264.614       77.704   ops/ms

i.n.m.b.ByteBufAllocatorBenchmark.unpooledHeapAllocAndFree_4_4096       thrpt        20     2921.598       95.492   ops/ms

i.n.m.b.ByteBufAllocatorBenchmark.unpooledHeapAllocAndFree_5_16384      thrpt        20      991.631       49.220   ops/ms

i.n.m.b.ByteBufAllocatorBenchmark.unpooledHeapAllocAndFree_6_65536      thrpt        20      261.718       11.108   ops/ms

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 993.382 sec - in io.netty.microbench.buffer.ByteBufAllocatorBenchmark

你也可以直接从IDE运行基准测试。如果你导入了netty的最顶层项目,打开子项目microbench到子目录src/test/java/io/netty/microbench 。在buffer子目录,你可以像其它JUnit测试一样运行ByteBufAllocatorBenchmark 。主要的区别就是,你可以一下子运行全部的基准测试,而不是去一个个的运行每一个基准测试。如果maven一样,你可以在控制台看到同样的输出。

编写基准测试

虽然编写基准测试不是太麻烦,但是却不一定编写的正确。这不是因为microbench项目很难使用,而是因为你很难去避免一些常用的陷阱。因此,JMH提供了有用的annotation和特性来帮助你避免大多数的陷阱。为此,你需要使你的基准继承自AbstractMicrobenchmark,AbstractMicrobenchmark能保证以JUnit默认参赛的方式运行。

public class MyBenchmark extends AbstractMicrobenchmark {

}

下一步是创建一个方法以@GenerateMicroBenchmark 标注,然后给他一个合适的方法名。

@GenerateMicroBenchmark

public void measureSomethingHere() {

}

看这些样例是很好的主意能启发你如何去写JMH测试。你也可以看下JMH主要作者的一些座谈。

定制运行参数

默认的AbstractMicrobenchmark配置是

Warmup次数 10

测试次数 10

Fork数量 2

这些配置可以通过系统配置在运行的时候做配置

mvn -DskipTests=false -DwarmupIterations=2 -DmeasureIterations=3 -Dforks=1 test

需要注意通常并不建议跑测试时,用较少的循环次数,但是较少的次数有助于确认基准测试时工作的,在确认结束后,再运行大量的基准测试。

@Warmup(iterations = 20)

@Fork(1)

public class MyBenchmark extends AbstractMicrobenchmark {

}

这可以以方法级别或者类级别来运行基准测试,命令行的参数会覆盖annotation上的参数。

d0c1501a6d8bb921cf36400dc89de69f.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java命令行界面(第30部分):观察

这个有关Java命令行参数解析的系列文章由四个月来发表的29篇文章组成,涵盖了28个不同的开放源代码库,可用于解析Java命令行参数。 这篇文章收集了可以从本系列的前29篇文章中得出的一些观点,并提供了一些一般性的考虑,以便在选择2…

java导出excel 科学计数法_基于Java将Excel科学计数法解析成数字

需要注意的是一般的科学表达式是1.8E12 1.8E-12而在Excel中的科学表达式是1.8E12 1.8E-12我写的科学计数法的正则表达式是(-?\d\.?\d*)[Ee]{1}[\-]?[0-9]*导入EXCEL数据时将科学计数法解析成数字,Java代码:import java.text.DecimalFormat;import jav…

java描边_shape描边设置是否显示四周描边

android:width"1pt"/>android:topRightRadius"30pt"android:bottomRightRadius"30pt" />效果图如下:这里设置了左边描边不显示设置虚线:android:shape"line">android:dashGap"3pt"android:d…

java 垃圾回收手动回收_Java垃圾回收(2)

java 垃圾回收手动回收并行清理 今天,我们介绍了并行GC的工作原理。 具体来说,这是在Eden上运行并行Scavenge收集器,在Tenured一代上运行Parallel Mark and Sweep收集器的组合。 您可以通过传递-XX: UseParallelOldGC来获得此选项…

java正则表达式性能_译:Java 中的正则表达式性能概述

译者:Darren Luo1. 概述在本快速教程中,我们将展示模式匹配引擎是如何工作的。我们还将介绍在 Java 中优化正则表达式的不同方式。有关正则表达式的的使用介绍,请参阅此文。2. 模式匹配引擎java.util.regex 包使用了一种叫做 Nondeterministi…

带注释的控制器– Spring Web / Webflux和测试

Spring Webflux和Spring Web是两个完全不同的Web堆栈。 但是, Spring Webflux继续支持基于注释的编程模型 使用这两个堆栈定义的端点可能看起来相似,但是测试该端点的方式却大不相同,并且编写此端点的用户必须知道哪个堆栈处于活动状态并相应…

jquery解析java对象数组_Javascript / jQuery初学者:将对象推送到数组

Well you are changing the reference of same object通过示例了解它是如何工作的let a {};let b a;a.name xyz;a.name abc;console.log(a.name)console.log(b.name)所以在上面的示例中我们有两个变量a和b . a是一个对象 .每当我们更新名称时,最后一个值将被新的…

java查看jvm对象个数_jmap-查看 jvm 内存对象信息

jmap 概述命令jmap是一个多功能的命令。它可以生成 java 程序的 dump 文件,也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。参数option:选项参数。pid:需要打印配置信息的进程ID。executable:产…

OpenHub框架进行的异步通信

在本系列的前一部分中,我们介绍了OpenHub框架 。 这部分显示了框架最强大的功能之一- 异步消息传递模型 。 当源系统无法等待目标系统的响应时,将使用系统之间的异步通信。 有以下几个原因: 源系统必须尽可能地响应 ,并且不受外…

Java实现C语言select函数_一道面试题目,分别用sql 和java,c++, c语言实现,

引用来自“雨翔河”的评论获取国家假日办的的信息,然后根据假日办提供的信息来搞定。日期的话,哈哈,找个提供日期查询的接口,借用一下来查日期,也搞定了。总之哪里有的抄就抄哪里的。再来一个笨蛋的意见,把…

java注解的反射_Java注解与反射

概要本文主要是总结Java注解与反射的相关知识,加深自己对Java类动态语言的理解,同时为日后学习Spring打下基础。注解:什么是注解Annotation的作用不是程序本身,但是可以对程序作出解释。可以被其他程序(比如:编译器等)…

工厂设计模式和策略设计模式_设计模式:策略

工厂设计模式和策略设计模式这次我想谈谈策略设计模式 。 通过这种方式,我开始撰写有关行为设计模式的文章。 这种模式表示对象之间的某些交互模式,以使代码更灵活且组织得更好。此方法的最本质点是对象之间的松散耦合。 当您的应用程序中有多个实现目的…

java 8 排序反转_Java 8 排序小结

1、概述首先,让我们先定义一个简单的实体类:Datapublic class Human {private String name;private int age;public Human() {super();}public Human(final String name, final int age) {super();this.name name;this.age age;}}2、不使用Lambda表达式…

如何将不带web.xml的Spring应用程序部署到Tomcat

介绍 由于Servlet 3规范不再需要web.xml来配置Web应用程序,因此已通过使用注释代替。 在本文中,我们将研究如何在不使用web.xml情况下将简单的基于Spring的应用程序部署到Tomcat 8.5。*。 创建一个空的应用程序 使用以下命令使用maven webapp原型创建一…

java创建单线程计时器_我们如何在Java中实现计时器线程?

该定时器类计划任务一次或多次给定的时间运行。它也可以作为后台程序线程在后台运行。要将Timer与守护程序线程相关联,有一个带有布尔值的构造函数。计时器以固定的延迟和固定的速率安排任务。在固定的延迟中,如果系统GC延迟了任何执行,则其他…

Python和Java结合的项目实战_[项目实战] Python高级教程项目实战篇 Python和Java结合的项目实战 视频教程 [...

资源介绍课程简介:xa0xa0Python高级教程项目实战篇 Python和Java结合的项目实战 视频教程 教学视频----------------------课程目录Python项目实战篇[初级项目:图片社交电商导购漂流瓶]项目实现功能: 用户注册,登录,登出图片的多种…

java04376_Java - jdbc mybatis

jdbc首先配置maven包org.springframework.bootspring-boot-starter-jdbcorg.mybatis.spring.bootmybatis-spring-boot-starter2.1.0注意pom.xml中配置结点src/main/java**/*.xmlfalsesrc/main/resourcesstatic/*.*templates/*.***/*.xml**/*.yml**/*.propertiesfalse针对不同的…

设计模式 建造者模式_设计模式:建造者

设计模式 建造者模式有时需要在应用程序中创建一个复杂的对象。 一种解决方案是Factory模式,另一种是Builder设计模式。 在某些情况下,您甚至可以结合使用这两种模式。 但是在本文中,我想研究一下Builder设计模式 。 我需要说的第一件事是创造…

在MongoDB和Spring Batch中将XML转换为JSON和原始使用

总览 为什么将XML转换为JSON以在MongoDB中原始使用? 由于MongoDB使用JSON文档存储记录,就像表和行将记录存储在关系数据库中一样,我们自然需要将XML转换为JSON。 某些应用程序可能需要存储原始(未修改的)JSON&#xf…

java hash=0报空指针_怎么报空指针异常错误?

源自:2-2 开发第一个自定义标签怎么报空指针异常错误?java.lang.NullPointerExceptionat org.apache.tomcat.util.descriptor.tld.TldResourcePath.hashCode(TldResourcePath.java:164)at java.util.HashMap.hash(HashMap.java:338)at java.util.HashMap…