首先,不幸的是,文档很差。首先,我使用gradle而不是maven,因此使用maven原型不是一种选择。
其次,我想使用Java API,而不是命令行。
我非常简单的代码是:
public final class TestBenchmark
{
private static final int COUNT = 100_000;
private static final List<Integer> LIST = new ArrayList<>();
static {
for (int i = 0; i < COUNT; i++)
LIST.add(i);
}
@GenerateMicroBenchmark
public void foreachLoop()
{
int dummy;
for (final int i: LIST)
dummy = i;
}
@GenerateMicroBenchmark
public void forLoop()
{
int dummy;
final int size = LIST.size();
for (int i = 0; i < size; i++)
dummy = LIST.get(i);
}
public static void main(final String... args)
throws RunnerException
{
final Options options = new OptionsBuilder()
.forks(1)
.warmupIterations(1)
.measurementIterations(20)
.verbosity(VerboseMode.EXTRA)
.build();
new Runner(options).run();
}
}
因为我没有.include()
,所以它意味着.*
作为正则表达式所有基准。这是我项目中唯一的课程。
但不是:“没有找到基准”。
所以,作为最后的手段,我尝试并按照其他地方的建议创建了META-INF/MicroBenchmarks
文件; content,班级名称:
com.github.parboiled1.grappa.TestBenchmark
但它也不起作用:
Exception in thread "main" java.lang.IllegalStateException: Mismatched format for the line: com.github.parboiled1.grappa.TestBenchmark
当然,这个文件的格式没有记录。
但我不想用这个文件开头;我想指定要运行的类列表。
我该怎么做?
答案 0 :(得分:6)
您的问题不是基准测试不匹配,而是构建错误配置阻止JMH为您生成和编译合成基准测试代码。您必须让注释处理器运行,并让构建的其余部分将生成的源和资源打包到完整的包中,即使您之后要使用API也是如此。由Maven原型制作的项目就是这样做的。还有Ant sample确实指定了其他构建系统应该发生的事情。如果您想使用Gradle,try this。
P.S。在JMH中,META-INF / MicroBenchmarks是一个内部API,它可能会更改,恕不另行通知。没有惊喜你无法使用它。
答案 1 :(得分:2)
我正在使用Maven,因此这是一个 Maven 解决方案,但我确信如果您按照这些步骤操作,可以将其调整为Gradle。我不得不承认JMH的伟大之处因缺乏文件而黯然失色。
我最初无法正常运行,所以最后我创建了一个启动基准测试的JUnit测试用例。对我来说不是主要的,因为Jenkins更容易,我没有创建jar项目。
此配置文件告诉maven将* Benchmark.java添加到surefire执行中。
<profile>
<id>benchmark</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<includes>
<include>**/*Benchmark.java</include>
</includes>
</configuration>
</plugin>
</plugins>
</build>
</profile>
当我使用个人资料基准测试运行Maven时。然后执行基准测试。