我正在运行jmh benchmark,但是每个试用版中的调用都是串行进行的。如何使调用并发运行?

这是我的代码摘要:

@State(Scope.Benchmark)
public class FooBenchmark {
    @Param({"123456"})
    public int barId;

    @Setup
    public void setup() {
    }

    @Benchmark
    public void run(Blackhole hole) {
        System.out.println("A"); // for proof that it's serial (see below)
        ...
        System.out.println("B"); // for proof that it's serial (see below)
    }
}

这将先打印A,然后打印B。将永远不会给出两个连续的A或B。

最佳答案

如果要显式定义要在测试过程中使用的线程总数,则需要注释测试方法(方法用@Benchmark注释)或封闭类,其后用 @Threads(numberOfThreads) 注释:

@Threads(10)
@Benchmark
public void run(Blackhole hole) {
在此示例中,10线程将同时执行测试方法。
提醒一下,这是描述此批注的文档的一部分:

默认情况下,它将仅使用一个线程。
如果使用@Threads(Threads.MAX),它将使用Runtime.getRuntime().availableProcessors()线程。

09-10 03:12
查看更多