¿Julia compila el guión cada vez?


Julia language compila el script cada vez, ¿no podemos compilar binarios con julia en su lugar? Probé un pequeño script helloworld con la función println ¡tomó como 2,3 segundos para que Julia mostrara la salida! Sería mejor si podemos hacer binarios en lugar de compilar cada vez

Actualización: Ha habido algunos cambios en Julia, desde que hice esta pregunta. Aunque ya no estoy siguiendo las actualizaciones de Julia, ya que he hecho esta pregunta y si estás buscando algo similar, mira las siguientes respuestas y comentarios de las personas que están siguiendo a julia.

Además, es bueno saber que ahora se necesitan alrededor de 150ms para cargar un script.

 48
Author: Cœur, 2012-04-22

2 answers

Por el momento Julia JIT compila toda su biblioteca estándar al iniciar. Somos conscientes de la situación y actualmente estamos trabajando en el almacenamiento en caché de la salida JIT LLVM para remediar la situación, pero hasta entonces, no hay manera de evitarlo (excepto por el uso de la REPL).

 37
Author: Keno Fischer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-07 14:38:32

La respuesta de Keno es acertada, pero tal vez pueda dar un poco más de detalle sobre lo que está pasando y lo que estamos planeando hacer al respecto.

Actualmente solo hay un modo JIT LLVM:

  • Hay un intérprete muy trivial para algunas declaraciones simples de nivel superior.
  • El resto del código se introduce en código máquina antes de la ejecución. El código se especializa agresivamente utilizando los tipos de tiempo de ejecución de los valores a los que se aplica el código, propagados a través del programa usando la inferencia de tipo dinámico.

Así es como Julia obtiene un buen rendimiento incluso cuando el código se escribe sin anotaciones de tipo: si llamas a f(1) obtienes código especializado para Int64 - el tipo de 1 en sistemas de 64 bits; si llamas a f(1.0) obtienes una versión nueva que está especializada para Float64-el tipo de 1.0 en todos los sistemas. Dado que cada versión compilada de la función sabe qué tipos obtendrá, puede ejecutarse a una velocidad similar a C. Puedes sabotear esto escribiendo y usando funciones "type-unstable" cuyo tipo de retorno depende de datos en tiempo de ejecución, en lugar de solo tipos, pero hemos tenido mucho cuidado de no hacer eso al diseñar el lenguaje central y la biblioteca estándar.

La mayor parte de Julia se escribe en sí misma, luego se analiza, se infiere y se jitea, por lo que arrancar todo el sistema desde cero toma unos 15-20 segundos. Para hacerlo más rápido, tenemos un sistema por etapas donde analizamos, inferimos y luego almacenamos en caché una versión serializada del AST inferido por tipo en el file sys.ji. Este archivo se carga y se utiliza para ejecutar el sistema cuando se ejecuta julia. Sin embargo, ningún código LLVM o código máquina se almacena en caché en sys.ji, por lo que todo el jitting de LLVM aún debe hacerse cada vez que se inicia julia, lo que por lo tanto toma aproximadamente 2 segundos.

Este retraso de inicio de 2 segundos es bastante molesto y tenemos un plan para arreglarlo. El plan básico es poder compilar programas completos de Julia en binarios: ya sea ejecutables que se puedan ejecutar o .so/.dylib bibliotecas compartidas que se puede llamar desde otros programas como si fueran simplemente bibliotecas C compartidas. El tiempo de inicio de un binario será como cualquier otro programa C, por lo que el retraso de inicio de 2 segundos desaparecerá.

Anexo 1: Desde noviembre de 2013, la versión de desarrollo de Julia ya no tiene un retraso de inicio de 2 segundos ya que precompila la biblioteca estándar como código binario. El tiempo de inicio sigue siendo 10 veces más lento que Python y Ruby, por lo que hay margen de mejora, pero es bastante rápido. Siguiente el paso será permitir la precompilación de paquetes y scripts para que puedan iniciarse tan rápido como Julia ya lo hace.

Anexo 2: Desde junio de 2015, la versión de desarrollo de Julia precompila muchos paquetes automáticamente, permitiéndoles cargar rápidamente. El siguiente paso es la compilación estática de programas completos de Julia.

 93
Author: StefanKarpinski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-24 19:28:40