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
Je pense qu'au lieu de vous soucier de la performance, vous devriez commencer à vous soucier des interfaces et du "Principe ouvert/fermé" :-) –
vous avez bien entendu compris qu'il s'agit d'un exemple facilement compréhensible – Tim