Performance 不必要地真的违反绩效规则吗?
首先,, 我试着做一些事情,比如:Performance 不必要地真的违反绩效规则吗?,performance,fxcop,Performance,Fxcop,首先,, 我试着做一些事情,比如: class Class1 { public void Do() { } } class Class2 { public void Do() { } } 但fxcop告诉我: 性能规则,在可能的情况下避免重复的强制转换,因为它们会带来成本。缓存 “as”运算符的结果 所以我做了: Class1 c1 = o as Class1; Class2 c2 = o as Class2; if (c1 != null)
class Class1
{
public void Do()
{
}
}
class Class2
{
public void Do()
{
}
}
但fxcop告诉我:
性能规则,在可能的情况下避免重复的强制转换,因为它们会带来成本。缓存
“as”运算符的结果
所以我做了:
Class1 c1 = o as Class1;
Class2 c2 = o as Class2;
if (c1 != null)
c1.Do();
if (c2 != null)
c2.Do();
没有更多的错误。
但我试图衡量这是否真的是一个好的绩效规则:
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();
}
2090应该是最好的
所以。。。我在问我是否真的应该遵守这个规则。。。
也许,我没有纠正好的方式
感谢您的回答FxCop并不总是正确的,有时过于简单化,这是最常见的情况之一。除非你投3次或4次以上,否则你不会超过
as
操作符的成本…但是FxCop规则不会这样检查,它只会>1
也许用4.0版本检查会更好?我想既然dynamic
已经存在,他们不得不重新审视很多这些规则,但我们可能要等到它发布后才能知道。beta 2目前仍在检查您发布的样式,在本例中给出了一些不好的建议
但是,请记住,这在性能方面是微不足道的,不必担心,除非您循环数十万次
还有一件事需要记住,如果你看IL,那么有一部分时间它会与该死的东西保持一致,使警告完全无用。我认为,与其担心性能,不如开始担心接口和“打开/关闭原则”:-)你当然明白这是一个容易理解的例子。你也许是对的。我会忘记这条规则:)谢谢你的回答
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();
}
2090
1725