Я пытаюсь измерить производительность определенного метода. Я отлично провожу тесты при прямом вызове метода, но когда метод использовал завершаемое будущее с настраиваемым исполнителем, все рушилось. Я реализовал метод, чтобы использовать завершаемое будущее, чтобы принудительно установить тайм-аут, если метод занимает слишком много времени.
@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 завершил работу, но разветвленная виртуальная машина не завершилась, есть ли запущенные потоки? Жду еще 24 секунды ...
Незавершенные темы:
Может ли кто-нибудь объяснить мне, почему это происходит и как мне подойти к этому, чтобы заставить это работать?
Transliper
? - person Eugene   schedule 04.02.2018@SetUp
метода,Level.Invocation
, который задокументирован как очень опасный,CompletableFuture
, который предоставляет что-то при каждом вызове ... если бы вы могли объяснить на простом английском, что вы попытка измерить может быть ... Я не делал слишком много многопоточного кода вJMH
, но держу пари, что образцы вам очень помогут - person Eugene   schedule 04.02.2018