2009-09-02 4 views
1

J'ai juste une petite question de design.Quel sera le plus performant et pourquoi?

Si je suis arrivé ce code

public Interface Test 
{ 
    void Xyz(); 

} 


public class1 : WebControl , Test 
{ 
public void XyZ() 
{ 
    // do someting 
} 

public OnLoad() 
{ 
    ((Test)this).Xyz(); 

// or 

    Test ctrl = this as Test; 
    ctrl.Xyz(); 

// or 

    Xyz(); 

} 

} 

Est-ce que le code aura une différence de performance? Je pense que Xyz() appel direct sera plus rapide mais je ne suis pas sûr ((Test) this). Xyz() aura une différence avec l'appel direct.

Quelle est votre opinion à ce sujet, ou la documentation de référence.

Merci

ps: Je whant ai la performance de différence, pas de réponse avec ... pourquoi vous voulez lancer ou spécifier l'interface. Je sais que je pourrais appeler directement ma méthode

+2

Écrivez le code dans les deux sens. Sors un chronomètre. Essayez-le un million de fois dans chaque sens. Alors vous saurez la réponse! Tout ce que nous pourrions dire ici est juste un * guess *; La seule façon de réellement * répondre * à une question de performance est de l'essayer. –

Répondre

7

J'espère que le compilateur supprimerait à la fois le cast et le "as", étant donné qu'il peut garantir qu'ils réussiront tous les deux ... et si ce n'est pas le cas, le JIT pourrait bien le faire. Vous aurait besoin de l'opérateur as ou de cast si vous avez utilisé l'implémentation d'interface explicite, faites attention à vous. Dans ce cas, j'utiliserais une distribution: Personnellement, j'utilise seulement as si c'est possible pour la valeur et non être du bon type (dans une situation autre qu'un bogue). En fin de compte, toute différence de performance sera insignifiante, mais pour des raisons de lisibilité, je ferais tout simplement sans la distribution lorsque cela est possible.

+0

+1 Pour mentionner les optimisations JIT. –

+0

Merci pour la réponse. –

3

Appelez la méthode directement, il n'y a pas besoin de jeter la référence this au type d'interface que la mise en œuvre de la méthode est encore dans la classe actuelle. Si vous lancez la classe dans le type d'interface, vous ajoutez une indirection inutile pour obtenir une méthode dont vous disposez. Je ne pense pas qu'il y aurait une énorme différence de performance (comme Jon le fait remarquer, le JIT supprimera probablement tout le casting car il n'est pas nécessaire) mais pour des raisons de lisibilité, il suffit d'appeler directement la méthode.

Questions connexes