Bonjour,
si je chnage l' accesseur d'une méthode de private a public quel impact a t-il sur les performances ?
Merci
Bonjour,
si je chnage l' accesseur d'une méthode de private a public quel impact a t-il sur les performances ?
Merci
je ne suis vraiment pas sur du tout que cela influe sur les performances... c'et juste une question d'accessibilité pour les autres classes...
Après c'est évident que si tu met une méthode en public ben c'est que d'autres classes peuvent y accéder etc.. donc il y aura plus de traitement...
enfin pour moi ça n'influe pas intrinsèquement sur la rapidité...
J'en profite pour poser une question un peu dans le même sens : est-ce que le fait de passer par un getter plutôt qu'accéder directement à la propriété coute du temps ?
En gros, est-ce que le compilateur détecte que c'est un getter qui ne fait que rediriger vers le membre et donc optimise le code généré ?
Tant qu'il n'est pas redéfini la différence est vraiment minime, surtout que pour les getter tout simple sans trop de code le résultat est tout simplement "inliné", c'est à dire qu'avec le getter suivant :
Et le code suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 public int getValue() { return value; }
La JVM compilera cela comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part int a = monObject.getValue();
Code : Sélectionner tout - Visualiser dans une fenêtre à part int a = monObject.value;
Donc il n'y a aucune raison de passer à coté
a++
Salut,
Il y a bien une différence puisqu'une une méthode private n'est pas virtuelle, contrairement à une méthode public.
En effet comme une méthode private ne peut pas être redéfinie on n'a pas besoin de vérifier le type exact de l'instance pour rechercher la bonne méthode à appeller. C'est pourquoi les méthodes privates sont appellées via l'instruction invokespecial qui se contente d'invoquer la méthode.
A l'inverse, les méthodes publics peuvent être redéfinies et sont donc appellée via l'instruction invokevirtual qui vérifie le type de l'instance avant de rechercher la bonne version de la méthode à appeler... ce qui est un peu plus couteux...
Plus d'info :Quels sont les différents modes d'invocation de méthode ?
Toutefois il faut nuancer cela par plusieurs points :
- La JVM sait très bien optimiser les appels invokevirtual, et si le classloader ne comporte aucune classe redéfinnissant la méthode, l'appel sera direct ou presque et offrira le même ordre de performance que l'instruction invokespecial.
- De même pour les méthodes public final qui ne peuvent pas être redéfinies, qui sont bien appellée avec invokespecial (contrairement à ce que dit la FAQ par erreur).
Maintenant s'il existe plusieurs "versions" de la méthode public, les différences peuvent être importante sur un très grand nombre d'appel...
a++
oui adiGuba est l'un des fondateurs du langage java![]()
c'est la classe .. juste![]()
Partager