2014-09-12 2 views
9

Я использовал Rhino для компонента сценариев внутри графики. В проекте имеется около 200 небольших скриптов, работающих независимо. Сразу же при запуске приложения сценарии должны быть на полной скорости. Производительность Rhino была достаточной, но, поскольку Oracle советует мигрировать в Нашорн, я сталкиваюсь с дилеммой.Можно преодолеть медлительность Nashorn?

Под рисунком, показывающим разность нагрузок между Rhino и Nashorn, приблизительно 15 000 вызовов скриптов. Медленность запуска Nashorn - моя самая большая проблема.

Обратите внимание, что это было на JDK 1.8.0. JDK 1.8u5 похож

Engine performance compared

Я надеюсь, что картина ясна.

Это схема того, как я использую в ScriptEngine:

  • Я использую один скриптовый экземпляр двигателя,
  • я создать объект CompiledScript для каждого сценария,
  • SwingWorker выполняет CompiledScript .eval() один раз.
  • Каждые полторы секунды запускаются SwingWorkers.
  • Каждый CompiledScript имеет свой собственный экземпляр SimpleScriptContext, который используется повторно для каждого выполнения.

Ниже я включил профиль времени работы, как занят двигатель со временем; enter image description here

Кто-нибудь знает, как преодолеть пусковую медлительность Нашорна?


UPDATE 15 апреля '15
Запустил тот же тест с 200 отдельными скриптами на Java8u45.
Производительность намного лучше! Работает так же быстро, как Rhino на Java7.

+0

Rhino под Java 1.8 может быть раскрывающим. –

+0

Спасибо, это была бы моя последняя надежда. Кстати, я прочитал [здесь] (https://wiki.openjdk.java.net/display/Nashorn/Using+Rhino+JSR-223+engine+with+JDK8), что мне понадобится встроенная в банку. Любая идея, почему, или это было бы просто для разочарования? – Houtman

+0

Я читал: «Если вы хотите получить предварительно построенный бинарный файл, вы можете скачать здесь:« - так что проблем нет. Он скомпилирован не в Java 1.8 - так что. –

ответ

1

На Java 1.8, вы можете использовать Rhino с помощью javax.script API, используя эту зависимость Maven и запрашивает двигатель rhino:

<dependency> 
     <groupId>de.christophkraemer</groupId> 
     <artifactId>rhino-script-engine</artifactId> 
     <version>1.1.1</version> 
    </dependency> 

Главная страница здесь: https://github.com/cevou/rhino-script-engine

Бинарники: here

Если вам нужна самая последняя версия Rhino, вы можете переопределить ее, добавив что-то вроде этого:

<dependency> 
     <groupId>org.mozilla</groupId> 
     <artifactId>rhino</artifactId> 
     <version>${rhinoVersion}</version> 
    </dependency> 

Бинарные: here

Кстати, если вы хотите использовать получить последнюю Rhino на Java 1.7 с помощью javax.script, вы должны запросить имя двигателя rhino17R5 или вы можете случайно получить экземпляр старого Rhino, который является частью от JRE. Требуемое точное название двигателя зависит от версии rhino-script-engine. Для 1.1.1 это rhino17R5.

+0

Спасибо. (я не знаком с maven) Я не уверен, но если ваш носорог такой же версии, как можно построить с помощью этой статьи: https://wiki.openjdk.java.net/display/Nashorn/Using+Rhino + JSR-223 + engine + с + JDK8. Тогда этот интерпретатор на самом деле довольно медленный, чем тот, который встроен в java7. Может быть, вы знаете, почему? – Houtman

+0

Я думаю, что это взято непосредственно из OpenJDK (предположительно 7), потому что это исключение GPL + Classpath. Я думаю, что это будет намного более новая реализация, чем та, которую вы упомянули. – seanf

+0

Уровень оптимизации Rhino по умолчанию, возможно, изменился между старой реализацией ScriptEngine для Rhino и более поздней. – seanf

Смежные вопросы