Вы получите разные результаты, потому что во время выполнения вы используете разные JIT-компиляторы высшего уровня.Если не указано иное (например, с флагами команд):
- OpenJDK 1.8.0_192 использует C2
- GraalVM CE 1.0.0-rc10 использует компилятор Graal.
- GraalVM EE 1.0.0-rc10 использует корпоративную версию компилятора Graal.
JIT компилирует ваш код во время выполнения в машинный код, который сильно зависит от исходного кода, рабочей нагрузки, конфигурации JIT, включенных оптимизаций и так далее.
Разумно ожидать, что разные реализации JIT-компилятора будут показывать разные результаты в одном и том же тесте.
Если вы спрашиваете, почему GraalVM CE не показывает лучшие результаты в этом конкретном тесте, скорее, философский вопрос о разнице в целом;вот краткое объяснение.Все компиляторы в чем-то хороши, например, Graal имеет превосходный анализ escape и встроенные алгоритмы, которые показывают отличные результаты в коде, который использует абстракции: выделяет объекты, вызывает методы и т. Д.
Этот конкретный тест заполняет массиввставляет и запускает цикл.Что, вероятно, не позволяет Граалу делать то, что у него хорошо получается.Таким образом, это пример микробенчмарка C2 лучше.Вероятно, вы можете создать аналогичный тест, который GraalVM CE будет показывать превосходство над OpenJDK (возможно, вы можете попробовать это: http://www.graalvm.org/docs/examples/java-simple-stream-benchmark/).
Команда GraalVM запускает большой набор тестов, и это источникзнание того, что GraalVM CE лучше, однако нужно понимать, что сведение сложного набора результатов тестов к одному числу - не самая значимая вещь для оценки производительности любого конкретного фрагмента кода и его рабочей нагрузки. Всегда следует стремиться оценитьпо их коду.