45 votes

Pourquoi définir une classe en tant que final améliore les performances de la machine virtuelle Java?

Citant http://sites.google.com/site/gson/gson-design-document:

Pourquoi sont la plupart des classes dans Gson marqué comme final?

Alors que Gson fournit un assez architecture extensible en fournissant enfichable sérialiseurs et deserializers, Gson classes n'étaient pas spécialement conçu pour être extensible. Non-final les classes aurait permis à un utilisateur de légitimement étendre Gson classes, et alors s'attendre à ce que le comportement de travailler dans toutes les modifications ultérieures. Nous avons choisi de de limiter de tels cas d'utilisation par le marquage les classes final, et attendre jusqu'à ce qu'un bon de cas d'utilisation de ressort pour permettre l'extensibilité. Marquage d'une classe finale a également un léger avantage de fournir supplémentaire possibilités d'optimisation pour Java compilateur et de la machine virtuelle.

Pourquoi est-ce le cas? [Si je suppose: de la JVM sait classe est définitive, il ne maintient pas la méthode remplacer les tables? Existe-il d'autres raisons?]

Quel est l'avantage de la performance?

N'cela s'applique à des catégories que sont la fréquence instancié (POJO?) ou peut-être à la classe qui sont les détenteurs des méthodes statiques (classes utilitaires) ?

Sont des méthodes définies comme final peut aussi théoriquement d'améliorer les performances?

Existe-il des conséquences?

Merci, Maxim.

44voto

TofuBeer Points 32441

Virtuel (remplacée) méthodes sont généralement mis en œuvre par le biais de certains de tri de tableau (vtable) qui est en fin de compte un pointeur de fonction. Chaque appel de méthode a la surcharge d'avoir à passer par ce pointeur. Lorsque les classes sont marqués en définitive, toutes les méthodes ne peuvent pas être remplacées et l'utilisation d'un tableau n'est plus nécessaire - ce qu'il est plus rapide.

Certaines VMs (comme HotSpot) peut faire les choses plus intelligemment et de savoir si les méthodes sont/ne sont pas écrasés et de générer plus rapidement le code approprié.

Ici est quelques informations plus spécifiques sur le HotSpot. Et certains généraux de l'info aussi.

19voto

andersoj Points 10592

Un vieux, apparemment, n'est plus , mais encore en grande partie pertinente, l'article sur ce à partir d'IBM developerWorks, qui stipule:

La perception commune est que déclarer des classes ou des méthodes finale rend plus facile pour le compilateur inline appels de méthode, mais ce la perception est erronée (ou à l' moins, grandement exagérée).

finale de classes et de méthodes peut être un d'importants désagréments lors de l' programmation-ils limiter vos options pour la réutilisation de code existant et l'extension de la fonctionnalité de classes existantes. Bien que parfois un la classe n'est pas final pour une bonne raison, comme pour faire respecter l'immuabilité, l' avantages de l'utilisation finale devrait l'emportent sur les inconvénients. L'amélioration de la Performance est presque toujours une mauvaise raison de compromis de la bonne principes de conception orientée objet, et lorsque l'amélioration de la performance est faible ou inexistante, c'est un mauvais compromis en effet.

Voir aussi cette réponse similaire sur une autre question. Il y a aussi l' équivalent en question .Net, discuté ici. DONC, la discussion, "Sont finales méthodes inline?" Sur une question intitulée "Ce que les optimisations sont va être inutile de demain", celui-ci apparaît sur la liste.

Voici quelqu'un qui essaie de caractériser l'effet sur HotSpot inline de la statique et de la finale de classes.

Notez également qu'il ya un impliquant de les effets de l' final classes vs final méthodes. Vous pouvez obtenir quelque avantage de performance (encore une fois, je n'ai pas une bonne référence) pour l' final méthodes pour assurer, comme il pouvait de repère de l'équipe à faire de l'in-lining, il ne pouvait pas faire autrement (ou pas si simple). Vous obtenez le même effet lorsque vous marquez la classe final, ce qui signifie que toutes les méthodes sont soudainement finale ainsi. Notez que le Sun/Oracle gens prétendent que HotSpot pouvez généralement le faire avec ou sans l' final mot-clé. Il n'existe aucun supplémentaire effets d'avoir la classe elle-même final?

Pour référence, des liens vers la JLS sur la méthode final et final classes.

1voto

Michael Goldshteyn Points 24679

Ne connaissant pas l'implémentation de chaque machine virtuelle, je dirais théoriquement que si une machine virtuelle sait qu'un pointeur sur un objet est un pointeur sur un type final, elle peut effectuer des appels de fonction non virtuels (c'est-à-dire, directs ou indirects). à un membre des fonctions (c'est-à-dire pas d'indirection par le biais d'un pointeur de fonction), ce qui peut accélérer l'exécution. Cela peut également conduire à des possibilités d’inclusion.

1voto

LorenVS Points 5784

Marquage des classes finale permet à d'autres optimisations pour être appliqué pendant le JIT scène.

Si vous appelez une méthode virtuelle sur un non-classe final, vous ne savez pas si la bonne mise en œuvre est celle qui est définie dans la classe, ou de certains sous-classe que vous ne connaissez pas.

Toutefois, si vous avez une référence à une classe final, vous le savez la mise en œuvre spécifique qui est requise.

Considérer:

A extends B
B extends C

B myInstance = null;
if(someCondition)
   myInstance = new B();
else
   myInstance = new C();
myInstance.toString();

Dans ce cas, l'équipe ne peut pas savoir si C est de la mise en œuvre de toString() ou B de la mise en œuvre de toString() sera appelée. Toutefois, si B est marqué comme final, il est impossible pour toute application autre que B est à la bonne mise en œuvre

0voto

Stas Points 872

Aucune différence, c'est juste de la spéculation. Les seules situations où cela a un sens sont des classes comme String, etc. où jvm les traite différemment.

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