102 votes

Sont Java statique des appels plus ou moins cher que les non-statique des appels?

Est-il un avantage en matière de performances, d'une manière ou d'une autre? Est-ce compilateur/VM spécifique? Je suis en utilisant Hotspot.

78voto

Anon Points 827

La première: vous ne devriez pas faire le choix de la statique vs non-statiques sur la base de la performance.

Deuxième: dans la pratique, cela ne fera aucune différence. Hotspot peut choisir d'optimiser de façon statique les appels plus rapidement pour une méthode non-statique des appels plus vite pour l'autre.

Troisième: une grande partie du mythe entourant statiques et non statiques sont basés sur d'anciennes machines virtuelles (qui n'a pas fait n'importe où près de l'optimisation Hotspot), ou de certains de rappeler des anecdotes intéressantes sur C++ (dans lequel un appel dynamique utilise un plus accès à la mémoire qu'un appel statique).

45voto

Jon Skeet Points 692016

Ainsi, les appels statiques ne peuvent pas être remplacées (sont donc toujours des candidats pour inline), et ne nécessitent pas une nullité des contrôles. HotSpot un tas de frais optimisations pour les méthodes d'instance qui peut bien nier ces avantages, mais ils sont possibles raisons pour lesquelles un appel statique peut être plus rapide.

Toutefois, cela ne devrait pas affecter votre design - code le plus lisible, de façon naturelle et seulement s'inquiéter de ce genre de micro-optimisation si vous avez juste cause (que vous presque jamais ).

19voto

mikera Points 63056

Il est compilateur/VM spécifiques.

  • En théorie, un appel statique peut être faite légèrement plus efficace, car elle n'a pas besoin de faire une fonction virtuelle de recherche, et il peut également éviter le les frais généraux de le caché "ce" le paramètre.
  • Dans la pratique, beaucoup de compilateurs optimiser ce de toute façon.

Par conséquent, il n'est probablement pas la peine de se soucier, sauf si vous avez identifié cela comme une critique de problème de performance dans votre application. L'optimisation prématurée est la racine de tous les maux, etc...

Cependant j' ai vu cette optimisation donner une augmentation considérable des performances dans la situation suivante:

  • La méthode de l'exécution d'une très simple calcul mathématique avec aucun accès à la mémoire
  • Méthode invoquée millions de fois par seconde dans un contexte de pénurie boucle intérieure
  • CPU application où tous les bits de la performance qui importait

Si ce qui précède s'applique à vous, il peut être intéressant de tester.

Il existe également une autre bonne (et peut-être même le plus important!) raison de l'utilisation d'une méthode statique - si la méthode a effectivement la sémantique statique (c'est à dire, logiquement, n'est pas connecté à une instance de la classe), alors il est logique de le rendre statique afin de refléter ce fait. Connu des programmeurs Java constaterez alors la statique modificateur et pense immédiatement à "aha! cette méthode est statique, donc il n'a pas besoin d'une instance et qui, vraisemblablement, ne pas manipuler instance spécifique de l'état". Si vous avez communiqué à la nature statique de la méthode de manière efficace....

14voto

aioobe Points 158466

Comme les précédentes affiches ont dit: Cela ressemble à une optimisation prématurée.

Cependant, il existe une différence (mis à part le fait que les non-statique invokations besoin d'un appui supplémentaire sur un callee-objet sur la pile d'opérande):

Depuis les méthodes statiques ne peuvent pas être remplacés, il n'y aura pas de virtuel les recherches en cours d'exécution pour une méthode statique d'appel. Il peut en résulter une différence observable dans les circonstances.

La différence sur un byte-code est un non méthode statique appel est fait par le biais INVOKEVIRTUAL, INVOKEINTERFACE ou INVOKESPECIAL alors qu'une méthode statique d'appel est fait par le biais INVOKESTATIC.

12voto

Durandal Points 9434

Pour décider si une méthode doit être statique, l'aspect de performance devrait être hors de propos. Si vous avez un problème de performance, en faisant beaucoup de méthodes statiques ne va pas sauver la journée. Cela dit, les méthodes statiques sont presque certainement pas plus lent que n'importe quelle méthode d'instance, dans la plupart des cas légèrement plus rapide:

1.) Les méthodes statiques ne sont pas polymorphes, de sorte que la JVM a moins de décisions à prendre pour trouver le code à exécuter. C'est un point discutable dans l'Âge de Hotspot, depuis Hotspot permettra d'optimiser la méthode d'instance appels qui ont seulement un site de mise en œuvre, de sorte qu'ils effectuent le même.

2.) Une autre différence est que les méthodes statiques n'ont évidemment pas de "ce" de référence. Il en résulte un cadre de pile d'un logement plus petit que celui d'une méthode d'instance avec la même signature et le corps ("ce" est mis dans l'emplacement 0 des variables locales sur le "bytecode", tandis que pour les méthodes statiques slot 0 est utilisé pour le premier paramètre de la méthode).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X