2014-09-12 8 views
9

Ho usato Rhino per un componente di script all'interno della grafica. Nel progetto ci sono circa 200 piccoli script in esecuzione indipendente. Immediatamente all'avvio dell'applicazione gli script dovrebbero essere a piena velocità. Le prestazioni di Rhino erano sufficienti, ma dal momento che Oracle consiglia di migrare a Nashorn, sono di fronte a un dilemma.Si può superare la lentezza della partenza di Nashorn?

Sotto un'immagine che mostra la differenza di carico tra Rhino e Nashorn in circa 15.000 invocazioni degli script. La lentezza di avvio di Nashorn è il mio più grande problema.

Nota, questo era di nuovo su JDK 1.8.0. JDK 1.8u5 è simile

Engine performance compared

Spero che il quadro è chiaro.

Questa è una descrizione di come uso lo ScriptEngine:

  • sto usando uno script esempio motore,
  • creo un oggetto CompiledScript per ogni script,
  • Uno SwingWorker esegue un CompiledScript .eval() una volta.
  • Ogni mezzo secondo vengono avviati SwingWorkers.
  • Ogni CompiledScript ha una propria istanza SimpleScriptContext che viene riutilizzata per ogni esecuzione.

Di seguito ho inserito un profilo di esecuzione di come occupato il motore è nel tempo; enter image description here

Qualcuno sa come superare la lentezza di avvio di Nashorn?


AGGIORNAMENTO 15 APRILE '15
Ran lo stesso test con 200 script separati su Java8u45.
Le prestazioni sono decisamente migliori! Funziona allo stesso modo veloce di Rhino su Java7.

+0

Rhino sotto Java 1.8 potrebbe rivelarsi. –

+0

Grazie, sarebbe la mia ultima speranza. A proposito, ho letto [qui] (https://wiki.openjdk.java.net/display/Nashorn/Using+Rhino+JSR-223+engine+with+JDK8) che avrei avuto bisogno di un jar creato manualmente. Qualche idea sul perché, o sarebbe solo per scoraggiamento? – Houtman

+0

Ho letto: "Se invece vuoi ottenere un binario pre-compilato, puoi scaricare da qui:" - quindi nessun problema. È compilato in non Java 1.8 - quindi cosa. –

risposta

1

su Java 1.8, è possibile utilizzare Rhino tramite il javax.script API utilizzando questa dipendenza Maven e richiedendo il motore rhino:

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

Home page qui: https://github.com/cevou/rhino-script-engine

binari: here

Se vuoi la versione più recente di Rhino, puoi sostituirla aggiungendo qualcosa come:

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

binari: here

Per inciso, se si desidera utilizzare ottenere l'ultimo rinoceronte su Java 1.7 tramite javax.script, si dovrebbe chiedere il nome del motore rhino17R5 o si potrebbe casualmente ottenere un'istanza del vecchio Rhino che fa parte del JRE. Il nome motore esatto richiesto dipende dalla versione di rhino-script-engine. Per 1.1.1, è rhino17R5.

+0

Grazie. (Non ho familiarità con Maven) Non sono sicuro, ma se il tuo rinoceronte è la stessa versione che può essere costruita usando questo articolo: https://wiki.openjdk.java.net/display/Nashorn/Using+Rhino + JSR-223 + engine + con + JDK8 Quindi quell'interprete è in realtà un po 'più lento di quello integrato in java7. Forse sai perché? – Houtman

+0

Penso che questo sia preso direttamente da OpenJDK (presumibilmente 7), perché è GPL + eccezione Classpath. Penso che sarebbe un'implementazione molto più recente di quella che hai menzionato. – seanf

+0

Il livello di ottimizzazione predefinito di Rhino potrebbe essere cambiato tra la vecchia implementazione di 'ScriptEngine' per Rhino e la più recente. – seanf