背景
最近再看fllink的性能基准测试时,发现它使用了OperationsPerInvocation注解,本文就来记录下这个注解的含义
官方解释
从官方文档:http://javadox.com/org.openjdk.jmh/jmh-core/0.9/org/openjdk/jmh/annotations/OperationsPerInvocation.html
@Benchmark @OperationsPerInvocation(10) public void test() { for (int i = 0; i < 10; i++) { // do something } }
如上所示,不管是平均时间还是吞吐量,他衡量的是循环里面{do something}这个操作的
普通理解
在使用JMH进行基准测试时,JMH的统计结果不是以调用Invocation为统计结果的,而是以Operation也就是操作作为统计结果的,比如统计的是一次操作的耗时或者每秒多少次操作数(吞吐量),而不是一次调用的耗时或者每秒多少次调用次数,一个方法等同于一次调用Invocation,而一次调用可以对应N个操作(@OperationsPerInvocation(N)),N由注解OperationsPerInvocation里面的值决定,默认是1.比如假设同样一个方法,单纯只是@OperationsPerInvocation(1)和@OperationsPerInvocation(100)不一样的话,后面的注解表示一次调用代表100个操作,那么输出结果中,响应时间会提高100倍,吞吐量也会提高100倍
彩蛋:
为什么Loop基准测试中,得到的结论和这里的不一样?