Подтвердите достоверность эталонных тестов JMH для производительности цикла и потоков - PullRequest
0 голосов
/ 25 марта 2019

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

У меня есть ArrayList определенной длины, так что все элементы списка имеют три* символьные строки.

Вот соответствующие методы тестирования для этого:

@Benchmark
public long shortLengthConstantSizeFor() {
    long count   = 0;
    for (String val : shortLengthListConstantSize) {
        if (val.length() == 3) { ++ count; }
    }
    return count;
}

@Benchmark
public long shortLengthConstantSizeForEach() {
    IntHolder   intHolder   = new IntHolder();
    shortLengthListConstantSize.forEach(s -> { if (s.length() == 3) ++ intHolder.value; } );
    return intHolder.value;
}

@Benchmark
public long shortLengthConstantSizeLambda() {
    return shortLengthListConstantSize.stream().filter(s -> s.length() == 3).count();
}

@Benchmark
public long shortLengthConstantSizeLambdaParallel() {
    return shortLengthListConstantSize.stream().parallel().filter(s -> s.length() == 3).count();
}

Все, что я хочу подтвердить сообществу, это то, являются ли они "функционально эквивалентными" и действительно будут измерять то, чтоони, кажется, измеряют.Я не предоставляю здесь измерения, потому что это отвлекает.

Обратите внимание, что "shortLength" относится к "короткому списку".У меня также есть несколько блоков этих методов, со списками различной длины, вплоть до одного с 300k элементами.

1 Ответ

0 голосов
/ 25 марта 2019

Если под «функциональной эквивалентностью» вы подразумеваете, что каждый метод выполняет одну и ту же функцию или измерение, включая побочные эффекты, - это выглядит так.

Можно утверждать, что во втором методе вы должны использовать LongHolder а не IntHolder для соответствия домену функции.Но если ваше «значение» в действительности составляет long в этом классе - тогда это пропуск.

Стоит отметить, что count() это просто сокращение для map(x -> 1L).sum(), но оно ничего не меняетдля этого теста.

...