C#是操作员的绩效

我有一个需要快速性能的程序。在其内部循环之一中,我需要测试对象的类型,以查看其是否从某个接口继承。


一种方法是使用CLR的内置类型检查功能。最优雅的方法可能是'is'关键字:


if (obj is ISpecialType)

另一种方法是为基类提供我自己的虚拟GetType()函数,该函数返回预定义的枚举值(在我的情况下,实际上,我只需要一个布尔值)。该方法将很快,但不太优雅。


我听说有一个专门针对'is'关键字的IL指令,但这并不意味着它在转换为本地程序集时执行速度很快。谁能对“是”与其他方法的性能分享一些见解?


更新: 感谢您提供所有明智的答案!答案中似乎有几个有用的观点:安德鲁(Andrew)关于“是否”自动执行演员表的观点是必不可少的,但是Binary Worrier和Ian收集的性能数据也非常有用。如果对其中一个答案进行编辑以包括所有这些信息,那将是非常不错的。


九州编程
浏览 634回答 3
3回答

蝴蝶刀刀

我和Ian在一起,您可能不想这样做。但是,您知道,两者之间的差异很小,超过10,000,000次迭代枚举检查 大约需要700毫秒IS检查 大约在 1000毫秒内我个人不会以这种方式解决此问题,但是如果我被迫选择一种方法将是内置的IS检查,则性能差异不值得考虑编码开销。我的基础和派生类class MyBaseClass{&nbsp; &nbsp; public enum ClassTypeEnum { A, B }&nbsp; &nbsp; public ClassTypeEnum ClassType { get; protected set; }}class MyClassA : MyBaseClass{&nbsp; &nbsp; public MyClassA()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; ClassType = MyBaseClass.ClassTypeEnum.A;&nbsp; &nbsp; }}class MyClassB : MyBaseClass{&nbsp; &nbsp; public MyClassB()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; ClassType = MyBaseClass.ClassTypeEnum.B;&nbsp; &nbsp; }}JubJub:根据要求提供有关测试的更多信息。我从控制台应用程序(调试版本)运行了两个测试,每个测试如下所示static void IsTest(){&nbsp; &nbsp; DateTime start = DateTime.Now;&nbsp; &nbsp; for (int i = 0; i < 10000000; i++)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; MyBaseClass a;&nbsp; &nbsp; &nbsp; &nbsp; if (i % 2 == 0)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a = new MyClassA();&nbsp; &nbsp; &nbsp; &nbsp; else&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a = new MyClassB();&nbsp; &nbsp; &nbsp; &nbsp; bool b = a is MyClassB;&nbsp; &nbsp; }&nbsp; &nbsp; DateTime end = DateTime.Now;&nbsp; &nbsp; Console.WriteLine("Is test {0} miliseconds", (end - start).TotalMilliseconds);}在发行版中运行,像Ian一样,我得到60到70毫秒的时间差。进一步的更新-2012年10月25日几年之后,我注意到了一些有关此内容的信息,编译器可以选择省略bool b = a is MyClassB发行版,因为b并未在任何地方使用。此代码。。。public static void IsTest(){&nbsp; &nbsp; long total = 0;&nbsp; &nbsp; var a = new MyClassA();&nbsp; &nbsp; var b = new MyClassB();&nbsp; &nbsp; var sw = new Stopwatch();&nbsp; &nbsp; sw.Start();&nbsp; &nbsp; for (int i = 0; i < 10000000; i++)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; MyBaseClass baseRef;&nbsp; &nbsp; &nbsp; &nbsp; if (i % 2 == 0)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; baseRef = a;//new MyClassA();&nbsp; &nbsp; &nbsp; &nbsp; else&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; baseRef = b;// new MyClassB();&nbsp; &nbsp; &nbsp; &nbsp; //bool bo = baseRef is MyClassB;&nbsp; &nbsp; &nbsp; &nbsp; bool bo = baseRef.ClassType == MyBaseClass.ClassTypeEnum.B;&nbsp; &nbsp; &nbsp; &nbsp; if (bo) total += 1;&nbsp; &nbsp; }&nbsp; &nbsp; sw.Stop();&nbsp; &nbsp; Console.WriteLine("Is test {0} miliseconds {1}", sw.ElapsedMilliseconds, total);}。。。始终显示is检查大约需要57毫秒,而枚举比较大约需要29毫秒。注意: 我还是希望is支票,差额太小,无法在意
打开App,查看更多内容
随时随地看视频慕课网APP