Je suis en train de déconner avec a toy interpreter in Java et je pensais essayer d'écrire un compilateur simple qui peut générer du bytecode pour la machine virtuelle Java. Ce qui m'a fait penser, combien d'optimisation doit être faite par les compilateurs qui ciblent les machines virtuelles telles que JVM et CLI? Les compilateurs juste-à-temps (JIT) font-ils des plis constants, des optimisations de peepholes, etc.?Optimisation de machine virtuelle
Répondre
Je vais juste ajouter deux liens qui expliquent très bien Java's bytecode et certains des various optimization de la JVM pendant l'exécution.
L'optimisation du bytecode est probablement un oxymore dans la plupart des cas. À moins que vous ne contrôliez la machine virtuelle, vous n'avez aucune idée de ce qu'elle fait pour accélérer l'exécution du code, le cas échéant. Le compilateur devrait connaître les détails de la machine virtuelle afin de générer du code optimisé.
Optimisation bytecode est probablement un oxymore dans la plupart des cas
Je ne pense pas que ce soit vrai. Les optimisations telles que les invariants de la boucle de levage et les constantes de propagation ne peuvent jamais faire de mal, même si la JVM est assez intelligente pour les faire elle-même, par simple raison de rendre le code moins efficace.
L'optimisation est ce qui rend les JVM viables en tant qu'espace pour les applications à exécution longue, vous pouvez parier que SUN, IBM et vos amis font de leur mieux pour optimiser votre code bytecode et compilé JIT efficacement. Cela étant dit, si vous pensez que vous pouvez pré-optimiser votre bytecode alors il ne fera probablement pas beaucoup de mal. Cependant, il est intéressant de noter que les JVM peuvent avoir tendance à mieux fonctionner (et ne pas se briser) lorsqu'elles sont présentées avec le type de bytecode que le compilateur Java a tendance à construire. Il n'est pas impossible que des optimisations soient manquées ou même que la JVM se bloque lorsque des permutations de bytecode sont correctes mais contrairement à ce qui serait produit par javac. Espérons que ce genre de chose est plus dans le passé maintenant, mais peut être quelque chose à être conscient.
Les obfuscateurs tels que ProGuard effectueront de nombreuses optimisations statiques sur votre bytecode pour vous.
Le compilateur HotSpot optimisera votre code lors de l'exécution mieux que ce qui est possible au moment de la compilation - il a plus d'informations à utiliser, après tout. Le seul moment où vous devriez optimiser le bytecode au lieu de votre algorithme est lorsque vous ciblez des appareils mobiles, tels que Blackberry, où la JVM de cette plateforme n'est pas assez puissante pour optimiser le code lors de l'exécution et exécute simplement le bytecode.
Note à Aseraphim:
Il peut également être utile pour optimiser bytecode pour les applications non intégrées dans certains cas limités:
Lorsque le code délivrant sur le fil, par exemple pour les applications webstart, à minimiser la taille du livrable/cache et parce que vous ne connaissez pas nécessairement la capacité/vitesse du client.
Pour le code que vous connaissez, qui est critique pour les performances et utilisé au démarrage avant (par exemple) HotSpot a eu le temps de rassembler des statistiques.
Encore une fois, les transformations effectuées par un bon optimiseur/obfuscator peuvent être très utiles.
- 1. Machine virtuelle Globus Toolkit
- 2. Endianness de la machine virtuelle de Java
- 3. Get IP de ma machine C# avec machine virtuelle installée
- 4. écran de changement Python résolution machine virtuelle
- 5. Exécution de valgrind dans la machine virtuelle
- 6. synchronisation entre la machine locale et virtuelle
- 7. Comment renommer une machine virtuelle SharePoint
- 8. Plantages aléatoires de la machine virtuelle Java dans ConcurrentGCThread
- 9. Considérations pour le développement d'un déploiement de machine virtuelle
- 10. ActionScript Machine virtuelle 1 - Inspection de la mémoire
- 11. Comment puis-je résoudre l'horloge dérivante de ma machine virtuelle?
- 12. depuis le démarrage de la machine virtuelle Java
- 13. Migration de logiciels déployés sur une machine virtuelle Linux?
- 14. Traitement des signaux dans la machine virtuelle Java
- 15. RMI/Gestion des exceptions dans une machine virtuelle Java personnalisée
- 16. Comment fonctionne une machine virtuelle basée sur un registre?
- 17. le code de débogage s'exécute dans une machine virtuelle à l'aide de l'hôte
- 18. Configuration de la machine virtuelle Java via la ligne de commande sous Windows
- 19. Obtention d'une liste de tous les chargeurs de classe dans une machine virtuelle Java
- 20. Plantage de la machine virtuelle pendant l'opération memcpy pendant le chargement de la classe
- 21. Obtention de variables locales à partir d'une image de pile sur la machine virtuelle Java
- 22. Impossible de se connecter à SQL Server 2008 Express de la machine virtuelle PC
- 23. Quelle est la machine virtuelle Java la plus légère de tous les temps? (sauf KVM)
- 24. Comment pouvez-vous vérifier efficacement le mappage de machine virtuelle pour une adresse?
- 25. Utilisation de Vista sous une machine virtuelle pour tester des applications
- 26. Comment contrôler l'utilisation de la mémoire des processus générés par une machine virtuelle Java
- 27. Une machine virtuelle peut-elle être implémentée en tant que réseau de neurones?
- 28. Comment est-ce que je tue une machine virtuelle de VMware qui ne mourra pas?
- 29. Puis-je effectuer un rendu sur plusieurs écrans à partir de la même machine virtuelle Java?
- 30. Quelle application Java est disponible pour tester de manière stressante une machine virtuelle?