Статьи

Насколько быстрее работает Java 11?

Java 11 была выпущена некоторое время назад, хотя большинство разработчиков остаются на Java 8 . Давайте посмотрим, какой из них быстрее для OptaPlanner . Лучший способ узнать это, конечно, запустить тесты OptaPlanner. Эта статья является продолжением нашей аналогичной статьи для Java 8 .

Методология сравнения

Для запуска теста мы использовали:

  • Стабильная машина без каких-либо других требующих вычислительных процессов процессов и с 2 x Intel® Xeon® CPU E5-2609 0 @ 2.4 GHz (8 cores total) и 31.3 GiB ОЗУ оперативной памяти с RHEL 6.
  • И G1, и Parallel GC для обеих версий Java для сравнения влияния сборки мусора. Java выполняется с параметрами -Xmx1536M -server -XX:+UseG1GC и -Xmx1536M -server -XX:+UseParallelGC соответственно.
  • Оба Oracle Java 8:
1
2
3
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

и OpenJDK 11:

1
2
3
openjdk version "11.0.1" 2018-10-16
OpenJDK Runtime Environment 18.9 (build 11.0.1+13)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.1+13, mixed mode)
  • OptaPlanner 7.14.0.Final
  • Решение проблемы планирования не требует ввода-вывода (за исключением нескольких миллисекунд во время запуска для загрузки ввода). Один процессор полностью насыщен. Он постоянно создает много недолговечных объектов, и GC собирает их впоследствии.
  • Каждый прогон решает 11 проблем планирования с OptaPlanner. Каждая проблема планирования длится 5 минут и начинается с 30-секундного прогрева JVM, который отбрасывается.
  • Тесты измеряют количество баллов, рассчитанных за миллисекунду. Чем выше, тем лучше. Расчет баллов для предлагаемого решения по планированию нетривиален: он включает в себя множество вычислений, в том числе проверку на конфликты между каждым объектом и любым другим объектом.

Управляющее резюме

В Java 11 среднее улучшение составляет 16,1% для G1 и 4,5% для Parallel GC. Хотя Parallel GC ориентирован на пропускную способность, в то время как G1 фокусируется скорее на сборке мусора с малой задержкой, значительное улучшение G1 в Java 11 приводит к прямому сравнению этих двух алгоритмов сборки мусора . Для получения дополнительной информации о разнице между различными алгоритмами GC, пожалуйста, смотрите эту статью .

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

Полученные результаты

Java 8 против Java 11

Балансировка облаков Переназначение машины Планирование курса Расписание экзаменов Медсестра работает . Турнир по путешествиям
JDK 200c 800c B1 B10 c7 с8 s2 s3 m1 MH1 nl14
Java 8 38074 34870 113490 20398 4296 4840 7003 5437 2385 2021 812
OpenJDK 11 41753 41282 166676 20363 4473 5466 8157 5927 2772 2536 +957
разница 9,7% 18,4% 46,9% -0,2% 4,1% 12,9% 16,5% 9,0% 16,2% 25,5% 17,9%
Средний 16,1%

Почти каждый набор данных улучшается в Java 11 по сравнению с Java 8 с помощью сборщика мусора G1. В среднем, улучшение происходит на 16% только благодаря переходу на Java 11. Возможным объяснением этого улучшения может быть JEP 307: Parallel Full GC для G1 , представленный в Java 10.

Балансировка облаков Переназначение машины Планирование курса Расписание экзаменов Медсестра работает . Турнир по путешествиям
JDK 200c 800c B1 B10 c7 с8 s2 s3 m1 MH1 nl14
Java 8 54990 52514 122611 13382 4821 5880 8775 6170 3234 2682 880
OpenJDK 11 54316 50120 140816 11129 4927 6071 8996 6383 3336 3087 1125
разница -1,2% -4,6% 14,8% -16,8% 2,2% 3,2% 2,5% 3,5% 3,2% 15.1% 27,8%
Средний 4,5%

С параллельным сборщиком мусора результаты менее определенны, чем G1. У некоторых наборов данных есть улучшения, в то время как другие остаются нетронутыми или даже показывают снижение производительности. Однако в среднем Java 11 работает более чем на 4% лучше.

Параллельный GC vs. G1 GC на Java 11

Балансировка облаков Переназначение машины Планирование курса Расписание экзаменов Медсестра работает . Турнир по путешествиям
Java 11 200c 800c B1 B10 c7 с8 s2 s3 m1 MH1 nl14
OpenJDK 11 Parallel GC 54316 50120 140816 11129 4927 6071 8996 6383 3336 3087 1125
OpenJDK 11 G1 GC 41753 41282 166676 20363 4473 5466 8157 5927 2772 2536 +957
разница -23,1% -17,6% 18,4% 83,0% -9,2% -10,0% -9,3% -7,1% -16,9% -17,8% -14,9%
Средний -2,3%

Хотя G1 GC демонстрирует явное улучшение по сравнению с Java 8, по сравнению с Parallel GC это менее выгодная стратегия GC для OptaPlanner для большинства наборов данных. Единственное исключение — переназначение машины, которое показывает, что G1 OptaPlanner может вычислить счет на 83% быстрее. Это относится и к Java 8, как показано в подсчете подсчета очков в секунду с G1 GC .

Вывод

Java 11 приносит дополнительные улучшения, которые различаются в разных примерах OptaPlanner и наборах данных. В среднем это на 4,5% быстрее при использовании Parallel GC и на 16,1% быстрее с G1 GC. Несмотря на значительное улучшение G1 GC, Parallel GC все еще быстрее для большинства наборов данных в этом тесте.