2009-08-22 10 views
20

Jestem dość nieświadomy świata Java (ja głównie C/Python), ale Scala wyglądała na tyle interesująca, by mnie wciągnąć. Jednym z problemów, z którym borykam się z tym problemem, jest ogromne obciążenie startowe - minimum 0,3 sekundy, znacznie więcej, jeśli Używam interpretera zamiast kompilacji, w porównaniu do efektywnie 0 dla Pythona lub C. Więc nawet jeśli język jest kilkadziesiąt razy szybszy niż Python, to gdy próbuję go użyć do prostych zadań, nadal jest znacznie wolniej w praktyce.Jak zmniejszyć obciążenie startowe Scala (/ Java)?

Czy istnieje sposób na zmniejszenie tego czasu, czy też jest to nieunikniona część JVM + liczba wymaganych (niejawnych) importów do programu Scala?

+0

Zobacz także http://stackoverflow.com/questions/1491325/how-to-speed-up-java-vm-jvm-startup-time –

Odpowiedz

15

Jakie komputera używasz go? Oczywiście istnieje obciążenie rozruchowe maszyny JVM, ale jest to jeszcze większe, jeśli JVM wykryje, że używasz server-class machine.

w platformie J2SE w wersji 5.0 klasy maszynie dalej maszynie serwer klasy została zdefiniowana jako maszyna z:

  • 2 lub więcej procesorów fizycznych
  • 2 lub więcej gigabajtów pamięci fizycznej

można umieścić JVM w trybu klienta za pomocąOpcja. Tryb klienta jest dostrojony do szybkiego uruchamiania.

Istnieje również ruch do modularize the JVM (projekt Jigsaw), co przyczyni się do poprawy czas uruchamiania nawet więcej - ten rozpoczął się JDK 1.6.0_10.

+1

Dzięki.-client znacznie pomaga, dzięki czemu mój program testowy "echo" wynosi średnio od 0,3 s do 0,12 sekundy. Jest to wystarczająco niskie, aby czuć się w większości przypadków responsywnym. Szkoda, że ​​większość "klientów" jest teraz wystarczająco gruba, aby spełnić wymagania serwera. –

8

Możesz obejść czas rozruchu maszyny JVM, otwierając Scala REPL, a następnie ładując skrypty bezpośrednio do niego, używając polecenia :load. Kompiluje to (zajmuje trochę czasu, ale nie znajduję długo w praktyce) zawartości skryptu i ładuje go do użycia w REPL. Na przykład:


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 

Na przykład, typowy przebieg pracy podczas pisania różnych prototypów w Scali jest następujący. Mam edytor tekstu otwarty w jednym oknie, a Scala REPL w innym. Piszę swój kod, a następnie go ładuję (:load script.scala). Wyniki generowane przez skrypt są natychmiast dostępne (jak widać w powyższym transkrypcie, res7) i dostępne są również wszelkie funkcje, klasy lub obiekty zdefiniowane w skrypcie. Jest szybszy niż uruchomienie scala myScript.scala, ponieważ JVM jest już załadowana.

Jeśli przejdziesz skompilowaną trasę, użyj fsc (szybki kompilator Scala). Przy pierwszym wywołaniu tworzy proces demona, który kompiluje kod. Dlatego będziesz musiał zapłacić cenę początkową JVM tylko raz. Zauważ, że jeśli zmienisz wartość CLASSPATH (zmienna środowiskowa), będziesz musiał ponownie uruchomić fsc (to jest coś, co mnie przez chwilę podsłuchiwało).

-- Flaviu Cipcigan

+0

Nawet przy użyciu fsc nie ma możliwości przeniesienia kompilacji do rozsądnego (tzn. Przyjaznego dla narzędzia) czasu uruchamiania. Celem jest zredukowanie czasu uruchamiania po skompilowaniu go, który jest wciąż uciążliwie długi. –

+0

Cóż, odkąd się uczę, podobał mi się REPL: load trick –

Powiązane problemy