2009-08-22 18 views
20

Soy bastante ignorante del mundo Java (lo hago principalmente C/Python) pero Scala se veía lo suficientemente interesante como para atraerme. Un problema que tengo es la enorme sobrecarga de inicio: 0.3 segundos como mínimo, mucho más si Estoy usando el intérprete en lugar de compilar, en comparación con efectivamente 0 para Python o C. Así que aunque el lenguaje es diez veces más rápido que Python una vez que se pone en marcha, si estoy tratando de usarlo para tareas simples todavía es considerablemente más lento en la práctica.Cómo reducir la sobrecarga de inicio de Scala (/ Java)?

¿Hay alguna manera de reducir este tiempo, o es una parte inevitable de la JVM + la cantidad de importaciones necesarias (implícitas) para un programa de Scala?

+0

Ver también http://stackoverflow.com/questions/1491325/how-to-speed-up-java-vm-jvm-startup-time –

Respuesta

15

¿Qué tipo de equipo que está utilizando en? Obviamente, hay una sobrecarga de inicio de JVM, pero esto es aún mayor si la JVM detecta que se está ejecutando en un server-class machine.

En la versión de la plataforma J2SE 5.0 una clase de máquina se hace referencia como una máquina de tipo servidor se ha definido como una máquina con:

  • 2 o más procesadores físicos
  • 2 o más Gbytes de memoria física

Usted puede poner la JVM en el modocliente mediante el -client opción. El modo de cliente está sintonizado para un tiempo de inicio rápido.

Existe también el paso a modularize the JVM (proyecto Jigsaw) que mejorará los tiempos de inicio aún más - esto ha comenzado con JDK 1.6.0_10.

+1

Gracias.-client ayuda significativamente, haciendo que mi programa de prueba de "eco" pase de 0.3 a 0.12 segundos en promedio. Eso es lo suficientemente bajo como para sentirse receptivo en la mayoría de los casos. Lástima que la mayoría de los "clientes" ahora son lo suficientemente gruesos como para cumplir los requisitos del servidor. –

8

Puede solucionar el tiempo de inicio de JVM abriendo Scala REPL y cargando sus scripts directamente en él con el comando :load. Esto compila (toma tiempo, pero no lo encuentro en la práctica) el contenido del script y lo carga para usarlo en el REPL. Por ejemplo:


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 

Por ejemplo, un flujo de trabajo típico al escribir diferentes prototipos en Scala es el siguiente. Tengo un editor de texto abierto en una ventana y Scala REPL en otra. Escribo mi código y luego lo cargo (:load script.scala). Los resultados producidos por la secuencia de comandos están disponibles de inmediato (como se ve en la transcripción anterior, res7) y las funciones, clases u objetos definidos en la secuencia de comandos también están disponibles. Y es más rápido que ejecutar scala myScript.scala ya que la JVM ya está cargada.

Si va por la ruta compilada, use fsc (el compilador rápido de Scala). La primera vez que se invoca crea un proceso de daemon que compila el código. Por lo tanto, solo tendrá que pagar el precio de puesta en marcha de JVM una vez. Solo tenga en cuenta que si cambia el valor de CLASSPATH (la variable de entorno), tendrá que reiniciar fsc (es algo que me ha molestado por un tiempo).

-- Flaviu Cipcigan

+0

Incluso con fsc no hay forma de reducir la compilación a un tiempo de inicio de sesión razonable (es decir, amigable para herramientas). El objetivo es reducir el tiempo de inicio una vez que lo haya compilado, que todavía es onerosamente largo. –

+0

Bueno, como estoy aprendiendo, me gustó el REPL: truco de carga –

Cuestiones relacionadas