JMH允许用户自定义一些计数器,
然后可以把你自己的计数器内容加入到执行结果中
怎么用
根据自定义的计数器输出吞吐量
在
@State注解上, 添加一个@AuxCounters注解@State(Scope.Thread)@AuxCounters( //专门放在@State对象上;Type有两种:AuxCounters.Type.OPERATIONS // 1.OPERATIONS: 报表吞吐量;)public static class OpCounters {// These fields would be counted as metricspublic int case1; //输出表格public int case2; //输出表格// This accessor will also produce a metricpublic int total() {return case1 + case2;}}
最后输出报表的时候, 会加三项
- case1
- case2
- total
只要是数字类型的就会被打印
@Benchmarkpublic void splitBranch(OpCounters counters) {if (Math.random() < 0.1) { //取值范围 [0,1)counters.case1++; //P=0.1} else {counters.case2++; //P=0.9}}
最后输出:
Benchmark Mode Cnt Score Error UnitsSample_23_AuxCounters.splitBranch thrpt 48653307.461 ops/sSample_23_AuxCounters.splitBranch:case1 thrpt 4868516.203 ops/sSample_23_AuxCounters.splitBranch:case2 thrpt 43784791.257 ops/sSample_23_AuxCounters.splitBranch:total thrpt 48653307.461 ops/s
是不是多了三个
根据自定义的计数器输出次数
@State(Scope.Thread)@AuxCounters(AuxCounters.Type.EVENTS //2.EVENTS:报表展示计数;)public static class EventCounters {// This field would be counted as metricpublic int wows;}
@Benchmarkpublic void runSETI(EventCounters counters) {float random = (float) Math.random();float wowSignal = (float) Math.PI / 4; //概率很低if (random == wowSignal) {// WOW, that's unusual.counters.wows++;}}
输出:
Benchmark Mode Cnt Score Error UnitsSample_23_AuxCounters.runSETI thrpt 55058210.016 ops/sSample_23_AuxCounters.runSETI:wows thrpt 3.000 #
什么场景需要使用呢?
- 如果我们要统计Benchmark里面的代码执行概率, 可以用它来评估
- 如果我们要统计Benchmark里面某些特殊的操作, 总共操作了多少次, 可以用它来评估
更加丰富我们的报表
可能用不上, 但是你既然学了JMH, 那么在看最终报表的时候起码要看懂吧
这里只是给你点印象, 记不住没关系, 后面遇到了再回来看看 体会体会
