Выступление Насорна на JDK 9 и JDK 10

Если вы интерпретируете библиотеку moment.js с помощью Nashorn на JDK 8, она запускается через пару секунд:

time .../JDK8/bin/jjs moment-with-locales-2.22.2.js
real    0m2.644s
user    0m10.059s
sys     0m0.287s

Но делайте то же самое на JDK 9 или 10, и это ужасно:

time .../JDK10/bin/jjs moment-with-locales-2.22.2.js
real    0m27.308s
user    0m59.690s
sys     0m1.353s

Это буквально в десять раз медленнее. Это только я?

Я знаю, что Nashorn будет устаревшим, но если он не работает должным образом, пока он поддерживается?

Какие-либо предложения? Обходные?

Ответ 1

Nashorn может использовать "оптимистичные типы" (более подробно), и они включены по умолчанию в Java 9 и более поздних версиях, но они вызывают задержки при запуске.

Выключение оптимистических типов дает:

$ time jjs --optimistic-types=false moment-with-locales.js
real    0m4.282s
user    0m0.000s
sys     0m0.015s

Переключатель может быть сокращен -ot=false.

jjs -h определяет оптимистические типы следующим образом:

Используйте предположения оптимистического типа с деоптимизацией перекомпиляции. Это заставляет компилятор попробовать, для любого символа программы, тип которого не может быть доказан во время компиляции, набирать его как можно более узким и примитивным. Если среда выполнения встречает ошибку, поскольку тип символа слишком узкий, более широкий метод будет генерироваться до достижения устойчивого уровня. Хотя это дает как можно более оптимальный Java-байт-код, ошибочные догадки типа приведут к более продолжительному разминке. Оптимистическая типизация в настоящее время включена по умолчанию, но может быть отключена для более быстрой загрузки.

Таким образом, оптимистичная типизация может обеспечить более высокую производительность в долгосрочной перспективе (хотя это не гарантируется), но приводит к более медленному запуску.