2009-08-22 16 views
20

Ich bin der Java-Welt ziemlich unwissend (ich mache hauptsächlich C/Python), aber Scala sah interessant genug aus, um mich einzubinden. Ein Problem, das ich damit habe, ist der enorme Startup-Overhead - mindestens 0,3 Sekunden, viel mehr Ich benutze den Interpreter anstatt zu kompilieren, im Vergleich zu effektiv 0 für Python oder C. Obwohl die Sprache zehnmal schneller ist als Python, sobald es anfängt, wenn ich versuche, es für einfache Aufgaben zu verwenden, ist es immer noch beträchtlich in der Praxis langsamer.Wie reduziert man Scala (/ Java) Startup Overhead?

Gibt es eine Möglichkeit, diese Zeit zu reduzieren, oder ist es ein unvermeidlicher Teil der JVM + die Anzahl der erforderlichen (impliziten) Importe für ein Scala-Programm?

+0

Siehe auch http://stackoverflow.com/questions/1491325/how-to-speed-up-java-vm-jvm-startup-time –

Antwort

15

Welche Art von Computer verwenden Sie es auf? Offensichtlich gibt es einen JVM-Startup-Overhead, aber dieser ist noch größer, wenn die JVM feststellt, dass Sie auf einem server-class machine laufen.

  • 2 oder mehreren physikalischen Prozessoren
  • 2 oder mehr Gbyte:

    In der J2SE Plattform, Version 5.0 eine Klasse von Maschine als der Serverklasse Maschine bezeichnet wurde als eine Maschine mit definiert des physikalischen Speichers

Sie können die JVM in Client setzen Modus durch diemitOption. Der Client-Modus ist auf schnelle Startzeit abgestimmt.

Es ist auch der Umzug in modularize the JVM (Projekt Jigsaw), die Startzeiten noch verbessern wird - dies mit JDK 1.6.0_10 begonnen hat.

+1

Danke.-client hilft erheblich und bringt mein "Echo" -Testprogramm von 0,3 Sekunden auf 0,12 Sekunden Durchschnitt. Das ist niedrig genug, um in den meisten Fällen zu reagieren. Schade, die meisten "Clients" sind jetzt dick genug, um die Serveranforderungen zu erfüllen. –

8

Sie könnten die JVM-Startzeit umgehen, indem Sie die Scala REPL öffnen und dann Ihre Skripte mit dem Befehl :load direkt in sie laden. Dies kompiliert (es dauert eine Weile, aber ich finde es nicht lange in der Praxis) den Inhalt des Skripts und lädt es für die Verwendung in der REPL. Beispiel:


scala> :load testScript.scala 
Loading testScript.scala... 
import scala.collection.mutable.Map 
memory: scala.collection.mutable.Map[Int,Int] = Map() 
fib: (Int)Int 
res7: Int = 165580141 

scala> fib(10) 
res1: Int = 55 

scala> fib(11) 
res2: Int = 89 

scala> fib(12) 
res3: Int = 144 

scala> fib(13) 
res4: Int = 233 

Zum Beispiel ist ein typischer Workflow von mir beim Schreiben verschiedener Prototypen in Scala wie folgt. Ich habe einen Texteditor in einem Fenster geöffnet, und die Scala REPL in einem anderen. Ich schreibe meinen Code und lade ihn dann (:load script.scala). Die vom Skript erzeugten Ergebnisse sind sofort verfügbar (wie in dem obigen Transkript, res7, gesehen) und alle Funktionen, Klassen oder Objekte, die im Skript definiert sind, sind ebenfalls verfügbar. Und es ist schneller als scala myScript.scala läuft, wie die JVM bereits geladen ist.

Wenn Sie die kompilierte Route gehen, verwenden Sie fsc (der schnelle Scala-Compiler). Beim ersten Aufruf wird ein Daemon-Prozess erstellt, der den Code kompiliert. Sie müssen daher nur einmalig den JVM-Startpreis bezahlen. Wenn Sie den Wert CLASSPATH (die Umgebungsvariable) ändern, müssen Sie fsc neu starten (es ist etwas, das mich für eine Weile gestört hat).

-- Flaviu Cipcigan

+0

Selbst mit fsc gibt es keine Möglichkeit, die Kompilierung auf eine normale (d. H. Werkzeugfreundliche) Startzeit herunter zu bringen. Das Ziel ist es, die Startzeit zu reduzieren, sobald ich es kompiliert habe, was immer noch sehr lange dauert. –

+0

Nun, seit ich lerne, mochte ich den REPL: Load Trick –

Verwandte Themen