2010-09-30 28 views
7

J'ai récemment couru à travers une classe qui avait le champ suivant déclaré:différences de performance entre les champs primitifs finaux statiques et non statiques en Java

private final int period = 1000; 

Dans ce cas particulier, l'auteur avait voulu qu'il soit aussi statique et comme la valeur ne pouvait être modifiée à aucun moment, il n'y avait aucune raison fonctionnelle réelle de ne pas la déclarer statique, mais j'ai commencé à me demander comment Java traitait les primitives statiques finales et finales.

En particulier:

1) Comment sont primitives statiques finales stockées? Sont-ils simplement compilés directement dans les expressions dans lesquelles ils sont utilisés?

2) Si elles sont réellement allouées au stockage, chaque instance de la classe conteneur doit-elle maintenir une référence à cet emplacement? (dans ce cas, pour les primitives de moins de 4 octets, chaque instance de la classe serait réellement plus grande que si elle incluait simplement la primitive directement comme dans le cas non-statique)

3) Les compilateurs sont-ils intelligents? Assez pour déterminer que dans des cas comme celui ci-dessus, la variable est «effectivement statique» puisqu'il serait impossible de faire en sorte que différentes instances contiennent des valeurs différentes et donc de l'optimiser de manière similaire à une variable statique finale?

Répondre

5

1) Comment les primitives statiques finales sont-elles stockées? Sont-ils simplement compilés directement dans les expressions dans lesquelles ils sont utilisés?

Non compilé directement dans les expressions. Ils sont compilés dans le fichier .class et référencés par l'opcode ldc.

2) Si elles sont réellement allouées au stockage, chaque instance de la classe conteneur doit-elle maintenir une référence à cet emplacement? (Auquel cas, pour les primitives de moins de 4 octets, chaque instance de la classe serait plus importante que si elle simplement inclus directement le primitif comme il le ferait dans le cas non-statique)

Non, le " La référence "est cuite dans le bytecode, donc rien n'a besoin d'être stocké par instance.

3) Est-compilateurs maintenant assez intelligents pour déterminer que dans des cas comme celui ci-dessus, la variable est « effectivement statique » car il serait impossible d'avoir différentes instances contiennent des valeurs différentes et donc l'optimiser de façon similaire à un finale statique?

Pas sûr, mais je doute qu'il soit optimisé au niveau du compilateur. Le JIT entrerait probablement en jeu. Cependant, je ne suis pas du tout sûr du genre de "différences de performance" que vous attendez. Quel que soit le cas, l'impact sur les performances sera négligeable. (statique/non statique/final/non final)

+0

Re: # 3, je ne m'attendais pas vraiment à des différences de performance en termes de vitesse mais je ne savais pas si mon optimise en ne le stockant pas par instance a les champs finals statiques réels. Avec le recul, la différence de performance est probablement un abus de langage. Merci pour la clarification – Dusty