在我的场景中,基准测试中的方法应该在一个线程中按顺序运行并按顺序修改状态。
例如,有一个列表
调用序列必须是
add()--
也就是说,
add()
和 remove()
必须按顺序在一个线程中调用。
在使用JMH控制方法的顺序中,我了解到这些方法按照字典顺序运行。我尝试了下面的代码:
java prettyprint-override">@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
方法同时运行。在某些情况下,remove
在add之前运行,并引发
。
如何用JMH连续运行基准测试中的方法?
你从一个错误的前提条件开始,因此一切都失败了。你可以在这里看到作者更广泛的解释。你想在暗示不对称的地方得到对称。
如果你想看看需要多少添加-
@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);
}
我使用 jmh(http://openjdk.java.net/projects/code 工具/jmh/ ) 来基准测试一些方法。此外,我有一组参数,我想用它们作为参数来运行此方法。是否可以为每个特定参数值生成一个方法(带有@GenerateMicroBenchmark注释)? 现在我使用类似的实现,但不太方便,因为我必须手动编写很多统一的代码:
javapapers.com上的这篇文章展示了如何通过键入在Maven中运行JMH基准测试。在Maven中运行JMH非常方便,因为您可以从Eclipse Run配置甚至在Maven阶段轻松运行它。 然而,这种设置有两个问题: > < li> 当您杀死Maven时,JMH将继续在后台运行,因为< code>exec:exec在一个单独的虚拟机中启动它。 通常,JMH 将启动另一个 VM 来运行基准测
我有几个用@Benchmark注释的大型基准类。在使用基准构建jar后,我可以使用以下命令运行所有这些类 如果我不想运行所有基准测试,如何指定要运行的基准测试?
受另一个关于堆栈溢出的问题的启发,我编写了一个微型基准来检查,什么更有效: 有条件地检查零除数或 捕获和处理 下面是我的代码: 我对JMH完全陌生,不确定代码是否正确。 我的基准是正确的吗?你看到任何错误吗? 旁白:请不要建议询问https://codereview.stackexchange.com.对于Codereview,代码必须已按预期工作。我不确定这个基准是否能按预期工作。
如何按特定顺序运行quarkus测试?通常我们有@InSequence注释(来自arquillian IIRC),我们可以实现这一点。 但是我没有找到任何类似的Quarkus在"org.junit.jupiter.api"软件包提供Quarkus-朱尼5。 它将以一个替代的顺序运行,我试图使用org.junit.jupiter.api.顺序与@Testmetodorder(方法命令。nnotati