2012-04-13 9 views
19

Si compilo o no un programa de Raqueta, no hace ninguna diferencia en el rendimiento del tiempo de ejecución.Raqueta interactiva frente a rendimiento compilado

¿Es solo la carga del archivo que inicialmente se mejora mediante la compilación? En otras palabras, ¿ejecuta racket src.rkt una compilación de jit sobre la marcha, por lo que no veo diferencia en la compilación frente a la interactiva?

Incluso para los bucles apretados de aritmética entera, donde pensé que se produciría alguna diferencia, los tiempos del perfil son equivalentes ya sea que haya hecho raco make o no anteriormente.

¿Echo de menos algo simple?

PD, me doy cuenta de que puedo ejecutar la raqueta contra el archivo fuente (.rkt) o el archivo .zo. ¿La raqueta usa automáticamente el .zo si se encuentra uno que corresponde al archivo .rkt, o el archivo .zo se debe usar explícitamente? De cualquier manera, no hace ninguna diferencia en los números de rendimiento que estoy viendo.

Respuesta

18

Sí, tienes razón.

Raqueta compila el código en dos etapas: primero, el código se compila en forma de código de bytes, y luego, cuando se ejecuta, se inserta en el código de la máquina. Cuando compila un archivo, básicamente está creando el bytecode que se guarda al volver a compilarlo más tarde. Como normalmente no es algo que lleve mucho tiempo para pequeños fragmentos de código, no verá una diferencia notable en los tiempos de ejecución. Para un ejemplo extremo, puede eliminar todos los archivos *.zo en el árbol de recopilación e iniciar DrRacket: se necesitará un lote de para comenzar, ya que hay un montón de código, pero una vez que comience, se ejecutará casi como siempre. . (También sería lento hacer clic en "ejecutar", ya que eso volverá a cargar y recompilar algunos archivos.) Otra preocupación para piezas de código más grandes es que el proceso de compilación puede aumentar el consumo de memoria, pero eso tampoco es un problema con piezas de código más pequeñas. .

Consulte también Performace chapter en la guía para obtener sugerencias sobre cómo mejorar el rendimiento.

+0

Muchas gracias, Eli. – Scott

11

Racket siempre compilará su código, independientemente de si se ejecuta de forma interactiva en el REPL o se ejecuta desde la línea de comandos. Here es la sección de la guía que lo explica. En el modo interactivo, el compilador convierte cada expresión/definición en bytecode en la memoria y lo ejecuta. De lo contrario, los compiladores envían el bytecode a los archivos zo.

Nota: Eli respondió al mismo tiempo que yo. Vea su respuesta para más detalles.

Cuestiones relacionadas