9
votes

Un JVM moderne optimise-t-il une allocation de classe anonyme inline simple?

J'ai reçu une critique de code remarque aujourd'hui pour extraire cette classe anonyme dans un champ, pour éviter d'allouer encore et encore:

Collections.transform(new Function<Foo, Bar>(){
  Bar apply(Foo foo) {
    // do some simple local transform of foo into a Bar.
  }
});


0 commentaires

4 Réponses :


8
votes

Je ne voudrais pas particulièrement attendre l'optimiser cela, non.

Il faudrait s'assurer que collections.transform n'a jamais été étalé la fonction , et que la méthode elle-même ne fait jamais ce visible etc. . Évidemment, tout ce qui est faisable - mais cela serait potentiellement beaucoup de travail pour un gain relativement petit dans une très peu de situations.

Maintenant, quel est le fait que toute machine virtuelle est difficile à dire sans un examen très minutieux - mais je pense que "cela ne va pas affecter la performance de manière significative" est une chose plus raisonnable à dire que "le JVM l'optimise".


1 commentaires

Figuré autant. Je place trop de foi parfois dans les pouvoirs magiques des optimiseurs.



0
votes

Je ne pense pas que la JVM l'optimise probablement, la performance frappe ne vaut pas le coût d'optimisation. Cependant, les énormes avantages pour le code étant considérablement compris cela.


0 commentaires

1
votes

Si vous l'extrayez dans un champ ou non devrait vraiment dépendre de la fréquence que vous l'appelez et combien de temps la classe mère dure. Si la classe mère vit aussi longtemps que l'application et que vous appelez cette chose une fois dans une lune bleue, pourquoi vous déranger une instance pour une opération aussi triviale? Inversement, si vous appelez cette chose fréquemment, alors oui, détenez-la dans une variable pour enregistrer la peine de créer plusieurs objets.

Je pense que ma propre règle est de savoir si la portée de la classe interne est dans l'appel de la méthode et que votre méthode n'est pas une performance critique et que la mise en œuvre est petite, laissez-la là où elle est.


0 commentaires

-1
votes

Si vous souhaitez créer un code en ligne et ne pas créer d'objet pour la fonction à chaque fois, pourquoi ne pas utiliser une boucle. Vous ne serez pas plus efficace que cela. Cependant, si vous souhaitez une lisibilité plutôt que sur la performance (et la plupart du temps, c'est une meilleure idée), vous pouvez trouver une notation fonctionnelle de suites vous.

List<Bar> bars = new ArrayList<Bar>();
for(Foo foo: foos) {
   // do some simple local transform of foo into a Bar.
   bars.add(bar);
}


0 commentaires