JMH允许用户自定义一些计数器,
然后可以把你自己的计数器内容加入到执行结果中
怎么用
根据自定义的计数器输出吞吐量
在
@State
注解上, 添加一个@AuxCounters
注解@State(Scope.Thread)
@AuxCounters( //专门放在@State对象上;Type有两种:
AuxCounters.Type.OPERATIONS // 1.OPERATIONS: 报表吞吐量;
)
public static class OpCounters {
// These fields would be counted as metrics
public int case1; //输出表格
public int case2; //输出表格
// This accessor will also produce a metric
public int total() {
return case1 + case2;
}
}
最后输出报表的时候, 会加三项
- case1
- case2
- total
只要是数字类型的就会被打印
@Benchmark
public 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 Units
Sample_23_AuxCounters.splitBranch thrpt 48653307.461 ops/s
Sample_23_AuxCounters.splitBranch:case1 thrpt 4868516.203 ops/s
Sample_23_AuxCounters.splitBranch:case2 thrpt 43784791.257 ops/s
Sample_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 metric
public int wows;
}
@Benchmark
public 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 Units
Sample_23_AuxCounters.runSETI thrpt 55058210.016 ops/s
Sample_23_AuxCounters.runSETI:wows thrpt 3.000 #
什么场景需要使用呢?
- 如果我们要统计Benchmark里面的代码执行概率, 可以用它来评估
- 如果我们要统计Benchmark里面某些特殊的操作, 总共操作了多少次, 可以用它来评估
更加丰富我们的报表
可能用不上, 但是你既然学了JMH, 那么在看最终报表的时候起码要看懂吧
这里只是给你点印象, 记不住没关系, 后面遇到了再回来看看 体会体会