我在使用JMH时遇到了一些问题。
所以,我在Intellij Idea中创建一个空项目,然后在项目结构中添加jmh-core jar文件。最后,尝试运行样本,例如
import org.openjdk.jmh.annotations.GenerateMicroBenchmark;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
public class JMHSample_01_HelloWorld {
@GenerateMicroBenchmark
public void wellHelloThere() {
// this method was intentionally left blank.
}
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(".*" + JMHSample_01_HelloWorld.class.getSimpleName() + ".*")
.forks(1)
.build();
new Runner(opt).run();
}
}
但结果是
No matching benchmarks. Miss-spelled regexp?
Use EXTRA verbose mode to debug the pattern matching.
Process finished with exit code 0
使用verbosity(VerboseMode.EXTRA)
No matching benchmarks. Miss-spelled regexp?
Benchmarks:
Process finished with exit code 0
我尝试将输出路径更改为projectFolder\target\classes
,但没有更改。
然后我在调试模式下查看了源代码,看到resource = "/META-INF/MicroBenchmarks"
,urls.hasMoreElements()
为false,因此benchmarks
为空。然后我在样本jar文件中看到了MicroBenchmarks文件,其中包含有关测试的信息并且工作正常。
所以,问题是我做错了什么? 我是否必须手动编写有关测试的信息?
答案 0 :(得分:3)
请按照JMH页面上的说明设置基准项目,即:
“确保在获得支持之前尝试过这些内容: - Archetypes提供黄金版本配置。尝试生成干净的JMH基准测试项目并移植基准测试 那里。升级到较新的JMH时尝试这一点非常重要 版本,因为构建配置的微小差异可能 归因于你所看到的失败。“
如果您遵循这一点,您会注意到还需要添加 jmh-generator-annprocess 作为依赖项,并确保在运行任何测试之前运行它。