Question

Je suis intéressé par l'optimisation au moment de l'exécution par une machine virtuelle et à la compilation. J'ai eu l'idée que les optimisations sont les plus efficaces et les plus simples au moment de la compilation.

Cependant, ma pensée semble être fausse dans certaines circonstances. Cela est évident dans la déclaration de Steve Yeggie citée par Daniel

  

La ptimisation [O] est souvent plus facile quand elle est exécutée au moment de l'exécution par un ingénieux.   machine virtuelle - -.

Pourquoi l'optimisation est-elle plus facile lorsqu'elle est effectuée à l'exécution par une machine virtuelle plutôt qu'à la compilation?

Était-ce utile?

La solution

Réponse courte: car il est plus facile d'identifier et d'analyser au moment de l'exécution les points chauds, c'est-à-dire les parties de votre programme qui utilisent le plus de temps.

Réponse longue:

Si vous commencez à exécuter le code en mode interprété, une machine virtuelle peut compter la fréquence et la durée d'utilisation des différentes parties du code. Ces pièces peuvent être mieux optimisées.

Prenez les clauses imbriquées if-then-else. Moins de contrôles booléens nécessitent une durée d'exécution moindre. Si vous optimisez le chemin de la pièce, qui est exécuté plus souvent, vous obtiendrez un meilleur temps d'exécution global.

Un autre point est qu’au moment de l’exécution, vous pouvez émettre des hypothèses impossibles au moment de la compilation. Par exemple, la machine virtuelle Java est intégrée aux méthodes virtuelles en mode serveur - tant qu'une seule classe est chargée et implémente ces méthodes. Ce serait dangereux, si cela est fait au moment de la compilation. La machine virtuelle Java désoptimise à nouveau le code si une autre classe est chargée, mais cela ne se produit souvent jamais.

De même, au moment de l’exécution, la machine sur laquelle le programme est exécuté est mieux connue. Si vous avez une machine avec plus de registres, vous pouvez les utiliser. Encore une fois, ce n’est pas sûr si cela est fait au moment de la compilation.

Une chose à dire: l'optimisation au moment de l'exécution présente également des inconvénients. Le plus important: le temps pour les optimisations est ajouté à l'exécution du programme. En outre, c'est plus compliqué, car vous devez compiler des parties du programme et les exécuter. Les bogues dans la machine virtuelle sont critiques. Pensez à un compilateur, qui plante parfois - vous pouvez à nouveau compiler et tout va bien. Si une machine virtuelle se bloque parfois, cela signifie que votre programme se bloque parfois. Pas bien.

En conclusion: vous pouvez effectuer toutes les optimisations au moment de l’exécution, c’est possible au moment de la compilation ... et même plus. Vous avez plus d'informations sur le programme, ses chemins d'exécution et la machine sur laquelle le programme est exécuté. Mais vous devez prendre en compte le temps nécessaire pour exécuter les optimisations. En outre, cela est plus compliqué à faire au moment de l’exécution et les erreurs sont plus pertinentes qu’au moment de la compilation.

Autres conseils

Parce qu'il y a plus d'informations disponibles au moment de l'exécution. Par exemple, les informations exactes sur le processeur, le système d'exploitation et d'autres environnements sont connues. Ces informations ont une incidence sur la manière dont l'optimisation doit être effectuée.

La machine virtuelle possède le code complet du programme et le compilateur n'a souvent qu'un code partiel en raison de la traduction séparée de différentes unités de traduction. La machine virtuelle dispose donc de davantage de données pour l'analyse.

Parce qu'au moment de l'exécution, vous avez des informations supplémentaires: le fonctionnement de la machine, les limites de mémoire de votre processus et, ce qui est probablement le plus important, quel code est exécuté et à quelle fréquence.

Ces éléments vous permettent d’optimiser l’exécution à la compilation.

La machine virtuelle peut collecter des statistiques à optimiser, de même qu'une base de données sur votre utilisation.

La conservation continue des statistiques et la vérification des invariants constituent également un temps d’ajustement supplémentaire pour le temps d’exécution des fragments compilés ou interprétés. Si vous ne pouvez pas optimiser suffisamment rapidement et bien, ne vous inquiétez pas. Je ne pense pas qu'il soit plus facile d'obtenir de meilleurs résultats en utilisant le temps d'exécution au lieu du temps de compilation. Je pense que c'est encore plus difficile compte tenu de la complexité d'une bonne mise en œuvre.

Tout comme l’idée fausse commune selon laquelle les compilateurs optimisent suffisamment bien pour générer un meilleur assemblage que les humains, une machine virtuelle suffisamment intelligente peut nécessiter une habileté trop astucieuse pour fonctionner plus rapidement.

Ce qu'il faut reconnaître, c'est que ce n'est pas le concept d'une machine virtuelle qui permet des optimisations à l'exécution, mais bien que de nombreuses machines virtuelles ne rejettent pas les métadonnées du programme d'origine et disposent d'une fonctionnalité intégrée de réflexion. Un terme plus approprié à utiliser serait un & Quot; bibliothèque d'exécution & Quot; peut faire de meilleures optimisations que les optimisations statiques seules; cela s'applique aux langages non-VM tels que le C.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top