Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 不必要地真的违反绩效规则吗?_Performance_Fxcop - Fatal编程技术网

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