web-dev-qa-db-fra.com

Julia compile le script à chaque fois?

Le langage Julia compile le script à chaque fois, ne pouvons-nous pas plutôt compiler des binaires avec Julia? J'ai essayé un petit script helloworld avec la fonction println, il a fallu 2,3 ​​secondes à Julia pour afficher la sortie! Il serait préférable de créer des 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. Bien que je ne suive plus les mises à jour de Julia, puisque j'ai posé cette question et si vous cherchez quelque chose de similaire, consultez les réponses et commentaires ci-dessous des personnes qui suivent Julia.

De plus, il est bon de savoir qu'il faut maintenant environ 150 ms pour charger un script.

54
pahnin

Pour le moment, Julia JIT compile l'intégralité de sa bibliothèque standard au démarrage. Nous sommes conscients de la situation et travaillons actuellement sur la mise en cache de la sortie LLVM JIT pour remédier à la situation, mais jusque-là, il n'y a aucun moyen de contourner cela (sauf pour utiliser le REPL).

40
Keno Fischer

La réponse de Keno est parfaite, mais je peux peut-être donner un peu plus de détails sur ce qui se passe et ce que nous prévoyons de faire à ce sujet.

Actuellement, il n'y a qu'un mode LLVM JIT:

  • Il existe un interpréteur très trivial pour certaines instructions simples de haut niveau.
  • Tout autre code est jeté dans le code machine avant exécution. Le code est agressivement spécialisé en utilisant les types d'exécution des valeurs auxquelles le code est appliqué, propagés à travers le programme en utilisant l'inférence de type dynamique.

Voici comment Julia obtient de bonnes performances même lorsque le code est écrit sans annotations de type: si vous appelez f(1) vous obtenez un code spécialisé pour Int64 - le type de 1 Sur 64- systèmes de bits; si vous appelez f(1.0) vous obtenez une nouvelle version spécialement conçue pour Float64 - le type de 1.0 sur tous les systèmes. Étant donné que chaque version compilée de la fonction sait quels types elle obtiendra, elle peut s'exécuter à une vitesse similaire à C. Vous pouvez saboter cela en écrivant et en utilisant des fonctions "type-unstable" dont le type de retour dépend des données d'exécution, plutôt que de simples types, mais nous avons pris grand soin de ne pas le faire lors de la conception du langage de base et de la bibliothèque standard.

La plupart de Julia est écrite en elle-même, puis analysée, déduite par type et jitted, donc le démarrage de tout le système à partir de zéro prend environ 15 à 20 secondes. Pour le rendre plus rapide, nous avons un système par étapes où nous analysons, saisissons, puis mettons en cache une version sérialisée du type AST dans le fichier sys.ji. Le fichier est ensuite chargé et utilisé pour exécuter le système lorsque vous exécutez Julia. Cependant, aucun code LLVM ou code machine n'est mis en cache dans sys.ji, de sorte que toutes les opérations LLVM doivent encore être effectuées à chaque fois Julia démarre, ce qui prend donc environ 2 secondes.

Ce délai de démarrage de 2 secondes est assez ennuyeux et nous avons un plan pour le corriger. Le plan de base est de pouvoir compiler des programmes Julia entiers en fichiers binaires: soit des exécutables qui peuvent être exécutés soit des bibliothèques partagées .so/.dylib Qui peuvent être appelées à partir d'autres programmes comme si elles étaient simplement partagées Bibliothèques C. Le temps de démarrage d'un binaire sera comme tout autre programme C, donc le délai de démarrage de 2 secondes disparaîtra.

Addendum 1: Depuis novembre 2013, la version de développement de Julia n'a plus de délai de démarrage de 2 secondes car elle précompile la bibliothèque standard en code binaire. Le temps de démarrage est toujours 10 fois plus lent que Python et Ruby, donc il y a place à amélioration, mais c'est assez rapide. La prochaine étape sera de permettre la précompilation des packages et des scripts afin que ceux-ci puissent démarrer simplement aussi vite que Julia elle-même le fait déjà.

Addendum 2: Depuis juin 2015, la version de développement de Julia précompile automatiquement de nombreux packages, leur permettant de se charger rapidement. La prochaine étape est la compilation statique de programmes Julia entiers.

96
StefanKarpinski