78 votes

java combien coûte un appel de méthode

Je suis débutant et j'ai toujours lu que c'est mauvais de le répéter code. Cependant, il semble que dans le but de ne pas le faire, vous devez disposer d'extra appels de méthode habituellement. Disons que j'ai la classe suivante

public class BinarySearchTree<E extends Comparable<E>>{
    private BinaryTree<E> root;
    private final BinaryTree<E> EMPTY = new BinaryTree<E>();
    private int count;
    private Comparator<E> ordering;

    public BinarySearchTree(Comparator<E> order){
        ordering = order;
        clear();
    }

    public void clear(){
        root = EMPTY;
        count = 0;
    }
}

Serait-il être plus optimale, pour moi, de copier et coller les deux lignes dans ma méthode clear() dans le constructeur au lieu d'appeler la méthode? Si oui, comment beaucoup de différence cela fait-il? Que faire si mon constructeur fait 10 appels de méthode avec chacun définissant simplement une variable d'instance pour une valeur? Quelle est la meilleure programmation de la pratique?

71voto

Vineet Reynolds Points 40529

Serait-il être plus optimale, pour moi, de copier et coller les deux lignes dans ma méthode clear() dans le constructeur au lieu d'appeler la méthode?

Le compilateur peut effectuer l'optimisation. Et ne peut donc la JVM. La terminologie utilisée par le compilateur de l'écrivain et de la JVM auteurs, "inline expansion".

Si oui, comment beaucoup de différence cela fait-il?

De la mesurer. Souvent, vous trouverez qu'il ne fait aucune différence. Et si vous croyez que c'est une performance hotspot, vous serez à la recherche dans le mauvais endroit; c'est pourquoi vous aurez besoin de mesurer.

Que faire si mon constructeur fait 10 appels de méthode avec chacun définissant simplement une variable d'instance pour une valeur?

Encore une fois, cela dépend du bytecode généré et tout d'exécution des optimisations effectuées par la machine Virtuelle Java. Si le compilateur/JVM peut inline les appels de méthode. il va effectuer l'optimisation pour éviter la surcharge de la création de la nouvelle pile d'images lors de l'exécution.

Quelle est la meilleure programmation de la pratique?

En évitant l'optimisation prématurée. La meilleure pratique consiste à écrire lisible et bien conçus code, puis d'optimiser pour la performance des points sensibles dans votre application.

18voto

Daniel Martin Points 9148

Ce que tout le monde a dit au sujet de l'optimisation est tout à fait vrai.

Il n'y a pas de raison à partir d'un point de vue des performances aux commandes de la méthode. Si c'est un problème de performances, le JIT dans votre JVM va l'inclure. En java, les appels de méthode sont si proches qu'il n'est pas la peine d'y penser.

Cela étant dit, il y a un problème différent ici. À savoir, il est une mauvaise pratique de programmation de l'appel d'une remplacable méthode (c'est à dire, celui qui n'est pas final, staticou private) à partir du constructeur. (À compter de Java, 2nd Ed., p. 89 dans l'article intitulé "Conception et document de l'héritage ou de l'autre de l'interdire")

Ce qui se passe si quelqu'un ajoute une sous-classe de BinarySearchTree appelés LoggingBinarySearchTree qui l'emporte sur toutes les méthodes publiques avec un code comme:

public void clear(){
  this.callLog.addCall("clear");
  super.clear();
}

Puis l' LoggingBinarySearchTree ne sera jamais constructable! Le problème est qu' this.callLog sera null lorsque l' BinarySearchTree constructeur est en cours d'exécution, mais l' clear qui est appelée, est substituée une, et vous aurez une NullPointerException.

Notez que Java et C++ diffèrent ici: en C++, un constructeur de la superclasse qui appelle une virtual méthode finit par appeler celle qui est définie dans la classe mère, pas le remplacé un. Les gens de la commutation entre les deux langues, parfois de l'oublier.

Étant donné que, je pense que c'est probablement cleaner dans votre cas, aux commandes de l' clear méthode lorsqu'elle est appelée à partir du constructeur, mais en général en Java, vous devriez aller de l'avant et de faire tous les appels de méthode que vous voulez.

5voto

Marcelo Points 6708

Je voudrais certainement le laisser tel quel. Que faire si vous modifiez la logique clear() ? Il serait peu pratique de trouver tous les endroits où vous avez copié les 2 lignes de code.

3voto

Arafangion Points 5650

La meilleure pratique consiste à mesurer deux fois et à couper une fois.

Une fois l'optimisation du temps perdue, vous ne pourrez plus jamais la récupérer! (Alors, mesurez-le d'abord et demandez-vous s'il vaut la peine d'être optimisé. Combien de temps allez-vous économiser?)

Dans ce cas, la machine virtuelle Java effectue probablement déjà l'optimisation dont vous parlez.

2voto

Andreas_D Points 64111

Le coût d'un appel de méthode correspond à la création (et à l'élimination) d'un cadre de pile et de certaines expressions de code octet supplémentaires si vous devez transmettre des valeurs à 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