34 votes

Y a-t-il un coût d'exécution pour Casting en Java?

Y aurait-il des différences de performances entre ces deux morceaux?

 public void doSomething(Supertype input)
{
    Subtype foo = (Subtype)input;
    foo.methodA();
    foo.methodB();
}
 

contre.

 public void doSomething(Supertype input)
{
    ((Subtype)input).methodA();
    ((Subtype)input).methodB();
}
 

Y a-t-il d'autres considérations ou recommandations entre ces deux?

30voto

Jon Skeet Points 692016

Ainsi, le code compilé comprend probablement la fonte de deux fois dans le deuxième cas - donc , en théorie, c'est de faire le même travail deux fois. Cependant, il est très possible qu'une smart équipe de travail que vous êtes en train de faire la même distribution sur la même valeur, de sorte qu'il peut mettre en cache le résultat. Mais il est d'avoir à faire au moins une fois - après tout, il doit prendre une décision quant à l'opportunité d'autoriser la distribution de réussir, ou lever une exception.

Comme toujours, vous devez tester et le profil de votre code si vous vous souciez de la performance - mais je serais personnellement utiliser la première forme de toute façon, juste parce que c'est plus lisible pour moi.

8voto

Jonathan M Davis Points 19569

Oui. Les vérifications doivent être effectuées avec chaque fonte avec le mécanisme réel de la coulée, de sorte que la coulée plusieurs fois le coût sera plus élevé que le moulage en une seule fois. Cependant, c'est le genre de chose que le compilateur serait susceptible d'optimiser loin. On peut clairement voir que l'entrée n'a pas changé son type depuis la dernière coulée de fonte et devrait être en mesure d'éviter la multiplication des lancers - ou au moins d'éviter certains de la coulée de contrôles.

Dans tous les cas, si vous êtes vraiment qu' inquiet à propos de l'efficacité, je me demande si Java est le langage que vous devriez être en utilisant.

Personnellement, je dirais à utiliser la première. Non seulement est-il plus lisible, mais il est plus facile de changer le type plus tard. Vous n'aurez qu'à modifier dans un seul endroit au lieu de chaque fois que vous appelez une fonction de cette variable.

2voto

Riyad Kalla Points 6064

Je suis d'accord avec le commentaire de Jon, faites-le une fois, mais pour ce que ça vaut dans la question générale de "coûte cher", d'après ce que je me souviens: Java 1.4 a amélioré cela sensiblement avec Java 5, ce qui rend les lancers extrêmement peu coûteux. À moins que vous n'écriviez un moteur de jeu, je ne sais pas si c'est quelque chose à craindre. Je m'inquiéterais plutôt de l'auto-boxing / unboxing et de la création d'objets cachés.

1voto

Oso Points 355

Selon cet article, il y a un coût associé au casting: http://www.javaworld.com/javaworld/jw-12-1999/jw-12-performance.html

-4voto

fastcodejava Points 22174

Dans le premier cas :

 Subtype foo = (Subtype)input;
 

il est déterminé au moment de la compilation, donc sans frais lors de l'exécution.

Dans le second cas:

 ((Subtype)input).methodA();
 

il est déterminé au moment de l'exécution car le compilateur ne le saura pas. Le jvm doit vérifier s'il peut être converti en une référence de Subtype et sinon lancer ClassCastException etc. Il y aura donc un certain coût.

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