Производительность виртуального потока в 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операторы добавили много накладных расходов, как вы можете видеть из ранее опубликованных результатов.

0 ответов

Другие вопросы по тегам