2010-01-20 6 views
3

D'abord, je tente de faire quelque chose comme:DoNotCastUnnécessairement vraiment la règle de performance?

class Class1 
{ 
    public void Do() 
    { 
    } 
} 
class Class2 
{ 
    public void Do() 
    { 
    } 
} 

...

if (o is Class1) 
{ 
    Class1 c = (Class1)o; 
    c.Do(); 
} 
if (o is Class2) 
{ 
    Class2 c = (Class2)o; 
    c.Do(); 
} 

mais FxCop me dit que: Règles de performances, évitez double moulages lorsque cela est possible, car il y a une coût associé à eux. Mettre en cache le résultat du 'comme' opérateur ...

Je l'ai fait:

Class1 c1 = o as Class1; 
Class2 c2 = o as Class2; 
if (c1 != null) 
    c1.Do(); 
if (c2 != null) 
    c2.Do(); 

et plus d'erreur de FxCop. Mais je l'ai essayer de mesurer si c'est vraiment une bonne règle de performance avec:

static void Main() 
    { 
     object o = new Class1(); 
     int cst = 100000000; 

     Stopwatch sw1 = new Stopwatch(); 
     Stopwatch sw2 = new Stopwatch(); 
     sw1.Start(); 
     for (int i = 0; i < cst; i++) 
     { 
      GoodPerf(o); 
     } 
     sw1.Stop(); 
     var t1 = sw1.ElapsedMilliseconds; 

     sw2.Start(); 
     for (int i = 0; i < cst; i++) 
     { 
      BadPerf(o); 
     } 
     sw2.Stop(); 
     var t2 = sw2.ElapsedMilliseconds; 
     Console.WriteLine(t1); 
     Console.WriteLine(t2); 
    } 

    private static void BadPerf(object o) 
    { 
     if (o is Class1) 
     { 
      Class1 c = (Class1)o; 
      c.Do(); 
     } 
     if (o is Class2) 
     { 
      Class2 c = (Class2)o; 
      c.Do(); 
     } 
    } 

    private static void GoodPerf(object o) 
    { 
     Class1 c1 = o as Class1; 
     Class2 c2 = o as Class2; 
     if (c1 != null) 
      c1.Do(); 
     if (c2 != null) 
      c2.Do(); 
    } 

Et il affiche:

2090 
1725 

2090 est censé être le bon ... perf

Alors ... je demande si je devrais vraiment suivre cette règle ... Peut-être, je ne corrige pas le bon chemin ...

Merci pour votre réponse

+3

Je pense qu'au lieu de vous soucier de la performance, vous devriez commencer à vous soucier des interfaces et du "Principe ouvert/fermé" :-) –

+0

vous avez bien entendu compris qu'il s'agit d'un exemple facilement compréhensible – Tim

Répondre

1

FxCop n'a pas toujours raison, il est parfois trop simplificateur et c'est l'un des scénarios les plus courants. Sauf si vous lancez 3 ou 4+ fois, vous n'allez pas l'emporter sur le coût de l'opérateur as ... mais la règle FxCop ne vérifie pas comme ça, elle le fait juste> 1

Peut-être que ça va être mieux vérifier avec la version 4.0 VS? Je suppose que dynamic est là-bas, ils ont dû revoir beaucoup de ces règles, mais nous ne le saurons pas jusqu'à ce qu'il expédie probablement. La beta 2 que j'ai encore vérifie actuellement dans le style que vous avez posté, donnant un mauvais conseil dans ce cas IMO. Cependant, gardez à l'esprit que c'est minuscule en termes de performances, pas quelque chose à craindre à moins que vous ne boucliez des centaines de milliers de fois.

Quelque chose d'autre à garder à l'esprit, si vous regardez l'IL puis une partie du temps il aligne la fichue chose de toute façon, rendant l'avertissement complètement inutile.

+0

vous avez peut-être raison. Je vais oublier cette règle :) merci pour votre réponse – Tim