61 votes

Julia compile le script à chaque fois?

Julia langage compile le script à chaque fois, ne pouvons-nous pas de compiler des binaires avec julia à la place? J'ai essayé un petit helloworld script avec la fonction println il a pris comme 2,3 secondes pour julia afin de montrer la sortie! Il serait mieux si nous pouvons construire les binaires au lieu de les compiler à chaque fois

Mise à jour: Il y a eu quelques changements dans Julia, depuis que j'ai posé cette question. Si je ne suis pas en suivant les mises à jour pour julia plus, depuis que j'ai posé cette question et si vous cherchez quelque chose de similaire, regardez-la ci-dessous les réponses et commentaires par des gens qui sont la suite de julia.

Aussi, il est bon de savoir que maintenant il faut environ 150ms pour charger un script.

106voto

StefanKarpinski Points 4873

Keno réponse est sur place, mais je peux peut-être donner un peu plus de détail sur ce qu'il se passe et ce que nous allons faire à ce sujet.

Actuellement il y a seulement un LLVM JIT mode:

  • Il y a une très trivial interprète pour une simple top-niveau des états.
  • Le reste du code est jitted en code machine avant l'exécution. Le code est agressive spécialisées à l'aide de l'exécution des types de valeurs que le code est appliqué, propagé à travers le programme d'aide dynamique de l'inférence de type.

C'est de cette façon Julia obtient de bonnes performances, même lorsque le code est écrit sans annotations de type: si vous appelez f(1) vous obtenez le code spécialisés pour Int64 - le type d' 1 sur les systèmes 64 bits; si vous appelez f(1.0) , vous obtenez un nouveau jitted version qui est spécialisé pour Float64 - le type d' 1.0 sur tous les systèmes. Puisque chaque version compilée de la fonction sait quels types il sera arriver, il peut s'exécuter au C de la vitesse. Vous pouvez sabotage cela par l'écriture et l'utilisation de type "instable" de fonctions dont le type de retour dépend des données d'exécution, plutôt que de simplement les types, mais nous avons pris grand soin de ne pas le faire dans la conception de la base de la langue et de la bibliothèque standard.

La plupart de Julia est écrit en lui-même, puis analysé, le type déduit et jitted, de sorte que le démarrage de l'ensemble du système à partir de zéro prend 15 à 20 secondes. Pour le rendre plus rapide, nous avons une mise en scène système qui nous permet d'analyser, de type déduire, et puis mettre en cache une version sérialisée du type déduit de l'AST dans le fichier sys.ji. Ce fichier est alors chargé et utilisé pour faire fonctionner le système lorsque vous exécutez julia. Pas de LLVM code ou code machine est mise en cache en sys.ji, cependant, de sorte que tous les LLVM jitting doit encore être fait à chaque fois julia démarre, ce qui prend environ 2 secondes.

Ce 2-deuxième retard de démarrage est assez ennuyeux, et nous avons un plan pour le fixer. Le plan de base est d'être en mesure de compiler l'ensemble de Julia programmes binaires: soit des fichiers exécutables qui peuvent être exécutés ou .so/.dylib bibliothèques partagées qui peuvent être appelées à partir d'autres programmes comme si elles étaient simplement des bibliothèques C partagées. Le temps de démarrage d'un fichier binaire sera comme n'importe quel autre programme C, de sorte que les 2 secondes le délai de démarrage de la disparition.

Addendum: Depuis novembre 2013, la version de développement de Julia n'a plus de 2 secondes le délai de démarrage car il précompilation de la bibliothèque standard en code binaire. Le temps de démarrage est encore 10x plus lent que Python et Ruby, donc il n'y a de place pour l'amélioration, mais il est assez rapide. La prochaine étape sera de permettre à la précompilation des paquets et des scripts afin que ceux-ci peuvent démarrage rapide, comme Julia elle-même déjà fait.

48voto

Keno Fischer Points 549

Julia JIT compile actuellement toute sa bibliothèque standard au démarrage. Nous sommes conscients de la situation et travaillons actuellement à la mise en cache de la sortie JIT de LLVM pour remédier à la situation, mais jusque-là, il n’y avait aucun moyen de la contourner (à part l’utilisation du REPL).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X