ฉันอยู่กับเอียนเธอคงไม่อยากทำแบบนี้
อย่างไรก็ตามโปรดทราบว่ามีความแตกต่างเพียงเล็กน้อยระหว่างทั้งสองครั้งโดยมีการทำซ้ำมากกว่า 10,000,000 ครั้ง
- การตรวจสอบ enum มาที่700
มิลลิวินาที (โดยประมาณ)
- การตรวจสอบ IS เข้ามาที่ 1,000
มิลลิวินาที (โดยประมาณ)
โดยส่วนตัวแล้วฉันจะไม่แก้ไขปัญหานี้ด้วยวิธีนี้ แต่ถ้าฉันถูกบังคับให้เลือกวิธีใดวิธีหนึ่งมันจะเป็นการตรวจสอบ IS ในตัวความแตกต่างของประสิทธิภาพไม่คุ้มกับค่าใช้จ่ายในการเข้ารหัส
ฐานและคลาสที่ได้รับของฉัน
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: ตามที่ร้องขอข้อมูลเพิ่มเติมเกี่ยวกับการทดสอบ
ฉันเรียกใช้การทดสอบทั้งสองจากแอปคอนโซล (การสร้างดีบัก) การทดสอบแต่ละครั้งมีลักษณะดังต่อไปนี้
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);
}
เมื่อรันในรีลีสฉันได้รับความแตกต่าง 60 - 70 มิลลิวินาทีเช่นเอียน
อัปเดตเพิ่มเติม - 25 ต.ค. 2555
หลังจากผ่านไปสองปีฉันสังเกตเห็นบางอย่างเกี่ยวกับเรื่องนี้คอมไพเลอร์สามารถเลือกที่จะละเว้นbool b = a is MyClassB
ในรีลีสได้เนื่องจาก b ไม่ได้ใช้ที่ใดก็ได้
รหัสนี้ . .
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;
else
baseRef = b;
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 มิลลิวินาทีและการเปรียบเทียบ enum เข้ามาที่ 29 มิลลิวินาที
หมายเหตุ ฉันยังคงชอบis
เช็คความแตกต่างน้อยเกินไปที่จะใส่ใจ