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支票,差額太小,無法在意
- 3 回答
- 0 關(guān)注
- 660 瀏覽
添加回答
舉報