Question

En C ++ je déclare une méthode « en ligne » et le compilateur est susceptible de le ligne. Pour autant que je comprends il n'y a pas mot-clé dans Java.

Inlining est fait si la machine virtuelle Java décide de le faire? Puis-je influencer cette décision en quelque sorte?

Était-ce utile?

La solution

Quelques autres réponses ont suggéré que seules les méthodes finales peuvent être inline - ce n'est pas vrai, comme HotSpot est assez intelligent pour être en mesure de inline méthodes non-finale tant qu'ils n'ont pas été substituée encore . Quand une classe est chargée qui remplace la méthode, il peut annuler son optimisation. Il est évident que faire la méthode moyenne finale qui n'a jamais besoin ...

En fait laisser la machine virtuelle Java faire son travail - il est susceptible d'être beaucoup mieux travailler où inline que vous êtes

.

Avez-vous une situation où vous êtes convaincu que la machine virtuelle Java ne fait pas un bon travail? En supposant que vous utilisez HotSpot, avez-vous essayé d'utiliser la version du serveur au lieu de client? Cela peut faire une énorme différence.

Autres conseils

Bien que le compilateur java peut faire en ligne (pour de courtes méthodes précoces lié), le réel inline sera fait par le compilateur JIT. Le compilateur JIT (HotSpot) sera capable, même, en ligne méthodes virtuelles . La meilleure façon d'interagir avec elle est d'écrire un code simple et concis. Très probablement, le code qui utilise la réflexion ne permettra pas inline.

L'espoir qui aide.

En C ++ je peux déclarer une méthode "en ligne" et le compilateur inline il ... ou non. Le compilateur est libre de faire la ligne de fonction ou non, et vous ne pouvez pas vraiment affecter le résultat. Il est seulement une indication pour le compilateur.

En Java il n'y a pas une telle chose, le compilateur (et plus tard la machine virtuelle tout en effectuant des optimisations) peuvent décider de « en ligne » la méthode.

Notez que finale méthodes ont de plus grandes chances d'être inline (le compilateur ne peut pas inline méthodes non-finales, car ils peuvent être remplacés dans les classes dérivées). Avec VM moderne, une optimisation similaire peut être faite lors de l'exécution. La machine virtuelle signaleront le type (il peut effectuer des contrôles de type) et le code inline. Seulement si la vérification échoue, il retombera dans l'appel de méthode polymorphique unoptimized originale.

Inlining est plus susceptible de se produire si la méthode en question est:

  • court
  • finale
  • ne dépend pas des longues, des méthodes non finales

Comme ce sont les seuls cas où la machine virtuelle Java peut être certains des effets de l'appel.

class A {
    final int foo() { return 3; }
}

Compte tenu de cette classe, tout appel à foo () peut être remplacé par le « 3 » constante. Toute machine virtuelle Java1 peut le faire, parce que le finale mot-clé dicte explicitement qu'il est impossible d'avoir une sous-classe qui remplace « int foo () ».

Inlining la méthode présente les avantages suivants sur le site d'appel:

  • Aucun appel de méthode
  • Aucun envoi dynamique
  • Possibilité de fois la valeur constante, par exemple. "A.foo () + 2" 5 devient sans code exécuté à
    exécution.

Dans le passé, les programmeurs souvent inséré le mot-clé finale précisément pour cette raison . Ou pour mieux faciliter inline et augmenter la vitesse d'exécution, ils combiner plusieurs méthodes plus petites dans une méthode plus grande. Mais à bien des égards, ces techniques défont l'ensemble des installations de la modularisation et réutilisabilité construit dans le langage de programmation.

JVM moderne, comme la machine virtuelle Java HotSpot est capable de inline la classe sans finale . mot-clé **.

( http://java.sun.com/developer/ technicalArticles / réseau / HotSpot / inlining.html )

Lisez ce comportement Inlining. http://www.javacoffeebreak.com/articles/thinkinginjava/comparingc++ andjava.html

Il dit les méthodes finales peuvent être inline mais pas toujours.

Oui, si la machine virtuelle Java décide de le faire, il peut. Les moyens d'influencer comprennent le réglage de la méthode statique ou finale.

Bien sûr, la chose la plus importante à ce sujet est que la structure de la méthode doit être en ligne convivial. Court aide, mais surtout il faut utiliser que ses variables locales et ses paramètres, pas de champs, et la méthode minimale appels à d'autres méthodes dans la même classe.

Cependant, vous ne devriez pas chercher à faire de telles optimisations prématurément, vous pourriez effectivement être faire empirer les choses (parce que vous pourriez être à court-circuiter d'autres optimisations potentielles). La machine virtuelle Java sera parfois réaliser qu'une méthode peut être inline sans ces indications.

Lorsque l'on compare une fonction normale et la fonction finale (ce qui est dit être en ligne par machine virtuelle Java), je l'ai vu qu'il n'y a pas d'amélioration de la performance entre eux. Peut-être que les frais généraux d'appel de fonction est déjà très faible.

Note:. J'utilise l'algorithme flou boîte pour évaluer la performance

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top