gpt4 book ai didi

java - 如何使用 JMH 按顺序运行基准测试中的方法?

转载 作者:行者123 更新时间:2023-12-05 06:08:04 27 4
gpt4 key购买 nike

在我的场景中,基准测试中的方法应该在一个线程中顺序运行并按顺序修改状态。

例如,有一个List<Integer>称为 num在基准类。我想要的是:首先,运行 add()将数字附加到列表中。然后,运行 remove()从列表中删除号码。

调用顺序必须是add() --> remove() .如果remove()add() 之前运行或者它们同时运行,它们会引发异常,因为列表中没有元素。

add()remove()必须按顺序并在一个线程中调用。

Control the order of methods using JMH ,我了解到这些方法是按字典顺序运行的。我试过下面的代码:

@State(Scope.Group)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@BenchmarkMode(Mode.AverageTime)
@Fork(value = 10)
public class ListBenchmark {

private List<Integer> num;

public static void main(String[] args) throws RunnerException {
Options options = new OptionsBuilder()
.verbosity(VerboseMode.NORMAL)
.syncIterations(true)
.threads(1)
.include(".*" + ListBenchmark.class.getCanonicalName() + ".*")
.build();

new Runner(options).run();
}

@Setup(Level.Invocation)
public void setup() throws Exception {
num = new ArrayList<>();
}

@Benchmark
@BenchmarkMode(Mode.SingleShotTime)
@Group("num")
public void add() throws Exception {
num.add(1);
}

@Benchmark
@BenchmarkMode(Mode.SingleShotTime)
@Group("num")
public void remove() throws Exception {
num.remove(0);
}
}

但它不起作用,因为 add方法和 remove方法同时运行。在某些情况下,removeadd 之前运行并提出 IndexOutOfBoundsException .

如何使用 JMH 按顺序运行基准测试中的方法?

最佳答案

您从错误的前提条件开始,因此一切都失败了。您可以从作者那里看到更广泛的解释 here .您需要在隐含不对称的情况下实现对称。

如果你想看看需要多少add -> remove 将它们放在同一个@Benchmark中,对于单独的add > 或通过不同的 State remove。例如:

@State(Scope.Thread)
public static class BothAddAndRemove {

List<Integer> num;

@Setup(Level.Invocation)
public void setup() throws Exception {
num = new ArrayList<>();
}
}

@State(Scope.Thread)
public static class RemoveOnly {

List<Integer> num;

@Setup(Level.Invocation)
public void setup() throws Exception {
num = new ArrayList<>();
num.add(1);
}
}


@Fork(25)
@Benchmark
@BenchmarkMode(Mode.SingleShotTime)
public int add(BothAddAndRemove both) {
both.num.add(1);
return both.num.remove(0);
}

@Fork(25)
@Benchmark
@BenchmarkMode(Mode.SingleShotTime)
public int removeOnly(RemoveOnly removeOnly) {
return removeOnly.num.remove(0);
}

关于java - 如何使用 JMH 按顺序运行基准测试中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65177915/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com