2017-10-09 22 views
-2

Est-ce que le compilateur Java optimise et ne crée pas de nouveaux objets/références si ce n'est pas nécessaire?Optimisation du compilateur Java et création de nouveaux objets/références si cela n'est pas nécessaire

par exemple.

public class Foo { 

    public void foo(Object[] data) { 
     for(int i=0; i<data.length; i++) { 
      Object d = data[i];      // <-- here 
      bar(d); 
     } 
    } 

    private void bar(Object o) { 
     //... 
    } 

} 

est la même chose que:

public class Foo { 

    public void foo(Object[] data) { 
     for(int i=0; i<data.length; i++) { 
      bar(data[i]);       // <-- and here 
     } 
    } 

    private void bar(Object o) { 
     //... 
    } 

} 

dans exécution?

+6

Aucune création d'objet impliquée dans les deux extraits ... la seule chose qui est enregistrée (et oui, probablement optimisée telle quelle) est la variable locale. Pour voir si le compilateur produit réellement le même code, regardez le Bytecode. – Fildor

Répondre

2

C'est un sujet très compliqué, ce que le compilateur java optimise et ce qu'il ne fonctionne pas.

Lorsque vous compilez votre code avec javac, il n'optimise rien, sauf quelques fragments vraiment petits. Il laisse intacte, donc le JIT compiler a une meilleure connaissance à l'exécution. Donc, regarder bytecode n'est pas vraiment utile.

Lorsque votre code devient hot lorsqu'il est appelé suffisamment de fois, il est marqué pour l'optimisation par JIT, des optimisations complexes sont effectuées. Certaines personnes disent que le code optimisé par JIT peut être 20 fois plus rapide. En fonction de l'ensemble du contexte, votre code issu de cette question peut devenir complètement différent si JIT le décide, son exécution peut même être ignorée. JIT est définitivement capable de faire l'optimisation que vous demandez, et beaucoup plus que cela.

+0

En d'autres termes, lors de la compilation de bytecode rien n'est optimisé - ai-je raison? – THM

+0

Certaines choses sont faites: comme les finales statiques, le calcul d'expressions connues et la concaténation littérale de chaînes, les instructions switch. De plus, dans Java 9, l'ancienne concaténation de chaîne est remplacée par une nouvelle utilisation de 'StringConcatFactory'. Ce ne sont pas vraiment des optimisations en soi, mais seulement des choses qui peuvent être faites sans aucun inconvénient. – Shadov