Производительность виртуального потока в IntSteram по сравнению с обычным циклом for
Я пытаюсь создать 100 тыс. виртуальных потоков с помощью простых операторов печати. Когда я использую приведенный ниже код, расчетное время выполнения составляет 2 миллисекунды:
List < Thread > threads = IntStream.of(0, 100000)
.mapToObj(it -> Thread.ofVirtual().unstarted(() -> System.out.println(Thread.currentThread())))
.toList();
long begin = System.currentTimeMillis();
threads.forEach(Thread::start);
for (Thread thread: threads) {
thread.join();
}
long end = System.currentTimeMillis();
System.out.println("time taken: " + (end - begin) + " milliseconds");
Но когда я использую цикл вместо , расчетное время выполнения составляет 6925 миллисекунд.
List < Thread > threads = new ArrayList < > ();
for (int i = 0; i < 100000; i++) {
threads.add(Thread.ofVirtual().unstarted(() -> System.out.println(Thread.currentThread())));
}
long begin = System.currentTimeMillis();
threads.forEach(Thread::start);
for (Thread thread: threads) {
thread.join();
}
long end = System.currentTimeMillis();
System.out.println("time taken: " + (end - begin) + " milliseconds");
Я знаю, что это более эффективно использует память, чем обычные циклы. Но, насколько я понимаю,IntStream
не делает ничего магического по сравнению с циклом. Итак, мне интересно, почему существует большой разрыв в производительности, указанной выше. Я провожу этот эксперимент на 8-ядерном компьютере Mac.
Обновлять: IntStream.of()
принимает только два числа выше, и это не диапазон чисел. Итак, это неверно.
Я удалил операторы печати и использовалHashSet
для отслеживания количества используемых потоков платформы. После внесения исправлений расчетное время выполнения для создания 100 тыс. виртуальных потоков с использованием обоихfor
петля иIntStream.range()
в моей 8-ядерной системе составляет около 150 миллисекунд.
Добавлениеprint
операторы добавили много накладных расходов, как вы можете видеть из ранее опубликованных результатов.