【问题标题】:jmh: Run benchmark concurrentlyjmh:同时运行基准测试
【发布时间】:2016-09-22 16:32:41
【问题描述】:

我正在运行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。

【问题讨论】:

    标签: java concurrency jmh


    【解决方案1】:

    如果您想明确定义在测试期间要使用的线程总数,则需要在测试方法(使用 @Benchmark 注释的方法)或封闭类中使用 @Threads(numberOfThreads) 注释如下:

    @Threads(10)
    @Benchmark
    public void run(Blackhole hole) {
    

    在本例中,10 线程将同时执行测试方法。

    提醒一下,这里是描述此注释的文档的一部分:

    Threads 注释提供了要运行的默认线程数。

    这个注解可以放在Benchmark方法上生效 仅在该方法上,或在封闭类实例上产生效果 类中的所有Benchmark 方法。这个注释可能是 被运行时选项覆盖。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多