java - JMH Benchmark 性能怪异,因为 @Param 注释
问题描述
我尝试将 JMH 与参数一起使用,但使用 @Param 注释时会得到奇怪的结果。这是硬编码函数参数的情况:
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
@Warmup(iterations = 3, time = 3, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 4, time = 4, timeUnit = TimeUnit.SECONDS)
@Fork(1)
@State(Scope.Benchmark)
public class MyBenchmark {
NumberToBinaryArray array = new NumberToBinaryArray();
@Benchmark
public void testMethod() {
array.toBinaryArray2(0);
}
}
此实现具有性能:2_312_967_772 ops/sec(大约是 20 亿 ops/sec)。但是,如果我使用参数来降低 JMH 的性能:
public class MyBenchmark {
NumberToBinaryArray array = new NumberToBinaryArray();
@Param({"0"}) <= changed here
private int arg;
@Benchmark
public void testMethod() {
array.toBinaryArray2(arg); <= changed here
}
}
性能为 484_748_276 操作/秒。为什么这样 ?
解决方案
我找到了一个原因。这是因为不是最终字段(arg)。
推荐阅读
- python - 无法在 PDT 时区获取当前时间戳
- vb.net - Linq to Entities,选择有子实体的父实体,子实体匹配条件
- swift - 是否可以在约束中包含 Core Data 实体类型?
- windows - 我最新的 Windows 10 SDK 安装不包括 rc.exe 和 rcdll.exe,所以我收到 LNK1158 错误
- networking - 将 Kong Admin API 暴露给内部网络
- c++ - 将 QVector 缩小到最后 10 个元素并重新排列一项
- reactjs - Icomoon:删除 icomoon.ttf 后 Xcode 构建失败,仍然正常运行
- mysql - Hibernate 没有从 MySQL 数据库中检索到给定日期的正确行
- slack - 如何向 slack 中的用户提供消息的删除 URL?
- angular - 如何使用 Angular 和 Flutter(都是 Dart)为工作区设置 VS Code 调试?