第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C#是操作員的績效

C#是操作員的績效

九州編程 2019-10-18 14:05:37
我有一個需要快速性能的程序。在其內(nèi)部循環(huán)之一中,我需要測試對象的類型,以查看其是否從某個接口繼承。一種方法是使用CLR的內(nèi)置類型檢查功能。最優(yōu)雅的方法可能是'is'關(guān)鍵字:if (obj is ISpecialType)另一種方法是為基類提供我自己的虛擬GetType()函數(shù),該函數(shù)返回預(yù)定義的枚舉值(在我的情況下,實(shí)際上,我只需要一個布爾值)。該方法將很快,但不太優(yōu)雅。我聽說有一個專門針對'is'關(guān)鍵字的IL指令,但這并不意味著它在轉(zhuǎn)換為本地程序集時執(zhí)行速度很快。誰能對“是”與其他方法的性能分享一些見解?更新: 感謝您提供所有明智的答案!答案中似乎有幾個有用的觀點(diǎn):安德魯(Andrew)關(guān)于“是否”自動執(zhí)行演員表的觀點(diǎn)是必不可少的,但是Binary Worrier和Ian收集的性能數(shù)據(jù)也非常有用。如果對其中一個答案進(jìn)行編輯以包括所有這些信息,那將是非常不錯的。
查看完整描述

3 回答

?
蝴蝶刀刀

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超8個贊

我和Ian在一起,您可能不想這樣做。


但是,您知道,兩者之間的差異很小,超過10,000,000次迭代


枚舉檢查 大約需要700毫秒

IS檢查 大約在 1000毫秒內(nèi)

我個人不會以這種方式解決此問題,但是如果我被迫選擇一種方法將是內(nèi)置的IS檢查,則性能差異不值得考慮編碼開銷。


我的基礎(chǔ)和派生類


class MyBaseClass

{

    public enum ClassTypeEnum { A, B }

    public ClassTypeEnum ClassType { get; protected set; }

}


class MyClassA : MyBaseClass

{

    public MyClassA()

    {

        ClassType = MyBaseClass.ClassTypeEnum.A;

    }

}

class MyClassB : MyBaseClass

{

    public MyClassB()

    {

        ClassType = MyBaseClass.ClassTypeEnum.B;

    }

}

JubJub:根據(jù)要求提供有關(guān)測試的更多信息。


我從控制臺應(yīng)用程序(調(diào)試版本)運(yùn)行了兩個測試,每個測試如下所示


static void IsTest()

{

    DateTime start = DateTime.Now;

    for (int i = 0; i < 10000000; i++)

    {

        MyBaseClass a;

        if (i % 2 == 0)

            a = new MyClassA();

        else

            a = new MyClassB();

        bool b = a is MyClassB;

    }

    DateTime end = DateTime.Now;

    Console.WriteLine("Is test {0} miliseconds", (end - start).TotalMilliseconds);

}

在發(fā)行版中運(yùn)行,像Ian一樣,我得到60到70毫秒的時間差。


進(jìn)一步的更新-2012年10月25日

幾年之后,我注意到了一些有關(guān)此內(nèi)容的信息,編譯器可以選擇省略bool b = a is MyClassB發(fā)行版,因?yàn)閎并未在任何地方使用。


此代碼。。。


public static void IsTest()

{

    long total = 0;

    var a = new MyClassA();

    var b = new MyClassB();

    var sw = new Stopwatch();

    sw.Start();

    for (int i = 0; i < 10000000; i++)

    {

        MyBaseClass baseRef;

        if (i % 2 == 0)

            baseRef = a;//new MyClassA();

        else

            baseRef = b;// new MyClassB();

        //bool bo = baseRef is MyClassB;

        bool bo = baseRef.ClassType == MyBaseClass.ClassTypeEnum.B;

        if (bo) total += 1;

    }

    sw.Stop();

    Console.WriteLine("Is test {0} miliseconds {1}", sw.ElapsedMilliseconds, total);

}

。。。始終顯示is檢查大約需要57毫秒,而枚舉比較大約需要29毫秒。


注意: 我還是希望is支票,差額太小,無法在意


查看完整回答
反對 回復(fù) 2019-10-18
  • 3 回答
  • 0 關(guān)注
  • 660 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號