Последний выпуск Java 8 был снабжен множеством новых функций, одна из которых — совершенно новый движок JavaScript, который заменил устаревший Rhino . Этот новый двигатель, получивший название Nashorn (по-немецки « носорог» ), обладает высокой производительностью и совместимостью со спецификациями. Это определенно полезно, когда вы хотите смешать и сопоставить ваш код Java и JavaScript.
Чтобы проверить производительность Nashorn, я использую его для запуска Esprima и позволяю ему анализировать некоторую большую кодовую базу (unminified jQuery, 268 КБ). Этот быстрый, довольно ненаучный тест демонстрирует два аспекта среды выполнения JavaScript: непрерывное выделение памяти (для узлов синтаксиса) и нелинейное выполнение кода (анализ рекурсивного спуска).
Если вы хотите следовать, проверьте репозиторий bitbucket.org/ariya/nashorn-speedtest . Предполагая, что JDK 8 установлен правильно, выполните следующее:
javac -cp rhino.jar speedtest.java java -cp .:rhino.jar speedtest
Это тестовое приложение выполнит анализатор Esprima и токенизатор для содержимого тестового файла. Rhino получает первый шанс, Nashorn следует сразу после этого (каждый двигатель получает 30 прогонов). Вначале первый запуск Rhino составляет 2607 мс, и он медленно ускоряется, и, наконец, этот анализ завершается всего за 824 мс. Тайминги Nashorn имеют другую характеристику. Когда холодно, Nashorn сначала тратит 5328 мсек, чтобы выполнить операцию, но он быстро набирает темп и, прежде чем вы это знаете, начинает двигаться на полной скорости, достигая 208 мс за цикл.
За кулисами Nashorn компилирует ваш код JavaScript в байт-коды Java и запускает их на самой JVM. Вдобавок к этому Nashorn использует преимущества invokedynamic- инструкции (из проекта Da Vinci Machine , части Java 7), чтобы обеспечить «эффективное и гибкое выполнение » в динамической среде, такой как JavaScript. Другие языки JVM, особенно здесь, JRuby, также извлекают выгоду из этой новой функции invokedynamic.
А как насчет Nashorn против V8? Несправедливо сравнивать оба варианта: V8 разработан специально для JavaScript, а Nashorn использует закаленную в боях многоязычную JVM. Но для удовольствия репозиторий Git также включает реализацию тестового приложения на JavaScript, которая может быть выполнена с помощью оболочки V8. На той же машине V8 может выполнить задачу примерно за 110 мс. Nashorn еще не так совершенен, как V8, но вполне достижимо, что он вдвое медленнее, чем V8 для этого конкретного теста.
Как высокопроизводительный JavaScript на JVM, Nashorn имеет множество возможных приложений. Он служит хорошей платформой для игры и экспериментов с JavaFX. Тем не менее, он достаточно мощный, чтобы быть частью стека веб-сервисов ( Vert.x , Project Avatar ). На менее амбициозном уровне наличие другой быстрой реализации JavaScript всегда хорошо, так что есть альтернатива для запуска различных инструментов JavaScript в среде, где Node.js недоступен или не поддерживается. В качестве иллюстрации, проверьте мой предыдущий пост в блоге о простой задаче Ant для проверки кода JavaScript .
В следующий раз, когда у вас появится желание погонять носорогов, подумайте о Нашорне!