DoNotCast不一定真的是性能规则吗?

时间:2010-01-20 14:14:13

标签: performance fxcop

首先, 我试图做一些像:

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();
}

但是fxcop告诉我: 性能规则,尽可能避免重复转换,因为与它们相关的成本。缓存                    'as'运算符的结果......

所以我做完了:

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

并且没有更多的fxcop错误。 但我试着测量它是否真的是一个很好的性能规则:

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

2090应该是最好的......

所以......我在问我是否真的应该遵循这条规则...... 也许,我不纠正好方法......

感谢您的回答

1 个答案:

答案 0 :(得分:1)

FxCop并不总是正确的,它有时过于简单化,这是最常见的场景之一。除非你投射3到4次,否则你不会超过as运算符的成本...但是FxCop规则不会像这样检查,它只是&gt; 1

也许用4.0 VS版本检查会更好吗?我认为,因为dynamic在那里,他们不得不重新审视这些规则,但我们不会知道它可能会发布。测试版2我目前仍然会检查您发布的样式,在这种情况下给出一些不好的建议IMO。

然而,请记住,这在性能方面是微不足道的,除非你循环数十万次,否则不用担心。

要记住的其他事情,如果你看看IL,那么部分时间它就是该死的东西,让警告完全没用。