update programming programacion lenguaje learning language julialang downloads computing books julia-lang

julia-lang - programming - julialang downloads



¿Julia compila el guión cada vez? (2)

En este momento, Julia JIT compila toda su biblioteca estándar en el inicio. Somos conscientes de la situación y actualmente estamos trabajando en el almacenamiento en caché de la salida JV de LLVM para remediar la situación, pero hasta ese momento, no hay forma de evitarlo (excepto para usar el REPL).

El lenguaje Julia compila el guión cada vez, ¿no podemos compilar binarios con julia? ¡Probé una pequeña secuencia de comandos de helloworld con la función println que demoró 2,3 segundos para que Julia mostrara la salida! Sería mejor si pudiéramos hacer binarios en lugar de compilarlos 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 hice esta pregunta y si está buscando algo similar, mire las respuestas y los comentarios de las personas que están siguiendo a julia.

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


La respuesta de Keno es acertada, pero quizás pueda dar un poco más de detalles sobre lo que está sucediendo y lo que planeamos hacer al respecto.

Actualmente solo hay un modo LLVM JIT:

  • Hay un intérprete muy trivial para algunas declaraciones simples de nivel superior.
  • Todos los demás códigos se incorporan al código de 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 mediante 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 llama a f(1) , obtiene un código especializado para Int64 , el tipo 1 en sistemas de 64 bits; si llama a f(1.0) obtiene una versión recientemente adaptada que está especializada para Float64 , el tipo de 1.0 en todos los sistemas. Como cada versión compilada de la función sabe qué tipos obtendrá, puede ejecutarse a una velocidad similar a la de C. Puede sabotear esto escribiendo y usando las funciones de "tipo inestable" cuyo tipo de retorno depende de los datos en tiempo de ejecución, en lugar de solo de los tipos, pero hemos tenido mucho cuidado de no hacerlo al diseñar el lenguaje central y la biblioteca estándar.

La mayor parte de Julia está escrita en sí misma, luego se analiza, se deduce el tipo y se jadeó, 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 en el que sys.ji , sys.ji -inferimos y luego almacenamos en caché una versión serializada del AST de tipo inferido en el archivo sys.ji Este archivo luego se carga y se usa para ejecutar el sistema cuando ejecuta julia . Sin embargo, el código LLVM o el código de la máquina no se almacenan en la caché en sys.ji , por lo que todo el proceso LLVM aún debe realizarse cada vez que se inicie Julia, lo que lleva aproximadamente 2 segundos.

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

Addendum 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 espacio para mejorar, pero es bastante rápido. El siguiente paso será permitir la precompilación de paquetes y scripts para que puedan iniciarse tan rápido como lo hace Julia.

Anexo 2: desde junio de 2015, la versión de desarrollo de Julia precompila muchos paquetes automáticamente, lo que les permite cargarlos rápidamente. El siguiente paso es la compilación estática de programas completos de Julia.