Question simple, mais bonne réponse, je suppose.
utilise des interfaces génériques blesse la performance? P>
Exemple: P>
public interface Stuff<T> {
void hello(T var);
}
vs
public interface Stuff {
void hello(Integer var); <---- Integer used just as an example
}
4 Réponses :
YUP - Les génériques Java sont une construction entièrement compilée. Le JVM le voit comme une interface normale. Donc, il n'y a pas de gain ou de perte de performance d'exécution à l'aide de génériques. P>
Ils sont simplement un assistant à la compilation pour obtenir la sécurité de type. P>
Les génériques sont implémentés par type Erasure: les informations de type générique ne sont présentes qu'au moment de la compilation, après quoi elles sont effacées par le compilateur. p> blockQuote>
pris de: http: // java. Sun.com/j2se/1.5.0/docs/Guide/language/generics.html P>
En fait, je crois que dans votre exemple, est em> une faible différence de performance. La forme compilée de la première version suppose que Hello () reçoit un objet, tandis que dans la seconde, il suppose un entier.
Par conséquent, lorsque vous instaniez la trotteuse - Correction - P>
La distribution implicite ne sera pas ajoutée à Hello (). Cependant, si vous ajoutez une méthode getter qui le retourne, la distribution sera ajoutée à la valeur renvoyée. P>
La ligne de fond est - l'utilisation des génériques introduit un impact négatif sur les performances dans certains cas, par rapport au code non générique limité à des types spécifiques. P>
Pour toute implémentation concrète de Stuff entier code>, il y aura une couche implicite de objet code> sur le type de béton, entier code>. Voir ma réponse pour plus de détails.
Il existe un potentiel de perte de performance mineure, car le compilateur ajoute parfois des méthodes de pont synthétique. Considérez l'exemple suivant:
java.lang.Integer IntStuff.getData() void putData(java.lang.Integer)
+1, battez-moi, les méthodes synthétiques ajoutent des frais généraux - bien que ce soit une micro-optimisation que le JIT est susceptible d'optimiser quand même, personne ne devrait se soucier que si un problème ne se présente réellement. Mais il est utile de savoir au cas où.
Vous avez raison. Habituellement, les frais généraux sont pas i> vaut l'effort d'éviter les génériques. Mais il semble que le JIT ne puisse pas optimiser complètement la méthode du pont. Je viens d'effectuer des tests avec une boucle contenant uniquement data integer finale = intSTFF.getData (); intstuff.putdata (données); code>. Exécution de la boucle avec un Stuff IntStuff Stuff Code> Variable, même avec le -Server code> JVM option.
Ils ne sont pas directement comparables, autant que je sache. Le deuxième exemple ne doit-il pas prendre
objet code> comme paramètre?