2008-08-21 8 views
8

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

0

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é.

3

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.

3

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.

2

Les obfuscateurs tels que ProGuard effectueront de nombreuses optimisations statiques sur votre bytecode pour vous.

1

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.

0

Note à Aseraphim:

Il peut également être utile pour optimiser bytecode pour les applications non intégrées dans certains cas limités:

  1. 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.

  2. 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.

Questions connexes