В настоящее время я занимаюсь проектом, в котором я измеряю скорость различных типов циклов в Java, используя структуру Java Microbenchmark Harness (JMH). Я получил некоторые интересные результаты относительно потоков, которые я не могу объяснить, и мне было интересно, может ли кто-то, кто лучше понимает потоки и списки массивов, помочь мне объяснить мои результаты.
По сути, при переборе списков массивов размером около 100 метод stream.forEach намного быстрее, чем любой другой тип цикла:
Здесь показан график моих результатов: https://i.imgur.com/ypXoWWq.png а>
Я пробовал использовать списки массивов как объектов, так и строк, и все они дают одинаковые результаты. По мере увеличения размера списка потоковый метод по-прежнему работает быстрее, но разрыв в производительности между другими списками становится меньше. Я понятия не имею, что вызывает эти результаты.
@Fork(5)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 10, time = 100, timeUnit = TimeUnit.MILLISECONDS)
@Measurement(iterations = 10, time = 100, timeUnit = TimeUnit.MILLISECONDS)
@State(Scope.Thread)
public class StackOverflowQ {
List<Integer> intList;
int size = 100;
@Setup
public void setup() {
intList = new ArrayList<>(size);
for(int i = 0; i<size;i++){
intList.add(i);
}
}
/**
Work done to each item in the loop.
*/
public double doWork(int item) {
return item + 47;
}
@Benchmark
public void standardFor(Blackhole bh){
for (int i = 0; i<intList.size(); i++){
bh.consume(doWork(intList.get(i)));
}
}
@Benchmark
public void streamForEach(Blackhole bh){
intList.stream().forEach(i -> bh.consume(doWork(i)));
}
}