Выполнить тест по методу с использованием завершенного будущего

Я пытаюсь измерить производительность определенного метода. Я отлично провожу тесты при прямом вызове метода, но когда метод использовал завершаемое будущее с настраиваемым исполнителем, все рушилось. Я реализовал метод, чтобы использовать завершаемое будущее, чтобы принудительно установить тайм-аут, если метод занимает слишком много времени.

@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 секунды ...

Незавершенные темы:

Может ли кто-нибудь объяснить мне, почему это происходит и как мне подойти к этому, чтобы заставить это работать?


person Alkis Kalogeris    schedule 04.02.2018    source источник
comment
что такое Transliper?   -  person Eugene    schedule 04.02.2018
comment
Казалось бы, нужно дождаться завершения потоков! Проблема с асинхронным запуском ...   -  person Boris the Spider    schedule 04.02.2018
comment
@Eugene - настраиваемый класс, содержащий процесс метода. У него нет состояния, а процесс метода использует завершаемое будущее для выполнения фактической обработки с исполнителем фиксированного пула потоков.   -  person Alkis Kalogeris    schedule 04.02.2018
comment
Я обновил свой вопрос   -  person Alkis Kalogeris    schedule 04.02.2018
comment
@BoristheSpider ты можешь уточнить? Я всегда вызываю get inside process, поэтому в основном процесс - это синхронный метод (для внешнего мира) с политикой тайм-аута.   -  person Alkis Kalogeris    schedule 04.02.2018
comment
Нужно ли открывать исполнителя, чтобы выключать его в каждом бенчмарке? При выходе в производство исполнитель никогда не будет отключен.   -  person Alkis Kalogeris    schedule 04.02.2018
comment
весь этот тест кажется мне подозрительным, два @SetUp метода, Level.Invocation, который задокументирован как очень опасный, CompletableFuture, который предоставляет что-то при каждом вызове ... если бы вы могли объяснить на простом английском, что вы попытка измерить может быть ... Я не делал слишком много многопоточного кода в JMH, но держу пари, что образцы вам очень помогут   -  person Eugene    schedule 04.02.2018
comment
процессу не обязательно иметь завершаемую будущую реализацию, это просто для обеспечения тайм-аута. Фактическая функциональность заключается в том, что он генерирует дерево и проходит по нему, но это не имеет значения, он изолирован (более того, я не могу опубликовать его здесь, к сожалению). Уровень. Призыв опасен? У вас есть ссылка, чтобы прочитать об этом?   -  person Alkis Kalogeris    schedule 04.02.2018
comment
Хорошо, нашел некоторую библиографию о вызове и изменил ее на пробную версию. Спасибо за внимание. Однако остается та же проблема.   -  person Alkis Kalogeris    schedule 04.02.2018
comment
Хорошо, теперь все работает. Я выставил исполнителя и закрывал его сносом аннотации. @Eugene, если вы хотите, предоставьте ответ, в котором говорится, что нужно изменить уровень и использовать фазу разрушения для исполнителя, чтобы я мог принять это   -  person Alkis Kalogeris    schedule 04.02.2018


Ответы (1)


Сначала обязательно просмотрите образцы JMH, с этими конфигами очень легко выстрелить себе в ногу (я пишу тесты через JMH, наверное, раз в неделю) и все равно каждый раз все портить.

Затем избавьтесь от Level.Invocation, если вы действительно не понимаете, что он делает ...

И последнее может быть выключено в @TearDown методе исполнителя.

person Eugene    schedule 04.02.2018