我正在尝试衡量特定方法的效果。 我直接调用方法时运行基准测试就好了, 但是当该方法使用自定义执行程序的可完成的未来时,一切都崩溃了。我已经实现了使用可填充的未来的方法,以便在方法花费太长时强制超时。
@Benchmark
@BenchmarkMode(Mode.SingleShotTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@Threads(value = 5)
@Warmup(iterations = 20)
@Measurement(iterations = 50, timeUnit = TimeUnit.MILLISECONDS)
public String very_big_query(TestState testState) throws Exception {
return testState.transpiler.process(testState.veryBigQuery);
}
@State(Scope.Thread)
public static class TestState {
String veryBigQuery;
Transpiler transpiler;
@Setup(Level.Trial)
public void doSetupTrial() throws Exception {
veryBigQuery = "(";
for(int i = 0; i < 99; i++) {
veryBigQuery += String.format("java_%s OR ", i);
}
veryBigQuery += "java_100) AND (";
for(int i = 100; i < 199; i++) {
veryBigQuery += String.format("java_%s OR ", i);
}
veryBigQuery += String.format("java_%s)", 200);
}
@Setup(Level.Invocation)
public void doSetupInvocation() throws Exception {
random = ThreadLocalRandom.current().nextInt(0, productionQueries.size());
randomQuery = productionQueries.get(random);
transpiler = new Transpiler(5, 100); //number of threads in custom pool for the executor, timeout in milliseconds
}
}
public String process(final String input) throws Exception {
CompletableFuture<String> cf = CompletableFuture.supplyAsync(() -> {
return SOME_STRING;
}, executor);
return cf.get(timeoutInMillis, TimeUnit.MILLISECONDS);
}
this.executor = Executors.newFixedThreadPool(numberOfThreads);
我收到此错误
JMH已经完成,但分叉VM没有退出,是否有流浪运行 线程?等待24秒......
未完成的主题:
有人可以向我解释为什么会发生这种情况,我该怎样处理才能使其发挥作用?
答案 0 :(得分:4)
首先要确保通过JMH
的样本,使用这些配置很容易用脚射击自己(我可能每周一次通过JMH进行测试)并且每次都会弄乱。
然后,摆脱Level.Invocation
,除非你真的明白它的作用......
最后可能会以@TearDown
方法关闭执行程序。