哪个更好用:Object.GetType()==typeof(Type)orObjectisType?我想知道哪个语句在PerformancePointofViewObject.GetType()==typeof(Type)或ObjectisTypeSecond:ObjectisType使用stringvsint测试这1'000'000'000次以获得://Release00:00:18.1428040//Object.GetType()==typeof(Type)00:00:03.9791070//ObjectisType//Debug00:00:21.3545510//Object.GetType()==typeof(Type)00:00:06.2969510//ObjectisType//Machinespecs://Intel(R)Core(TM)i5-3210MCPU@2.50GHz//6GBRAMmemory//Ubuntu14.04(OS)//Runtime:MonoJITcompilerversion3.2.8//Compiler:Monodmcs//Notes:runthesewithsomebackgroundprocesses,butthedifferenceintime//我猜已经足够重要了。注意:两者之间有很强的语义区别:从编译器的角度来看,这是非常合乎逻辑的:在第一个变体中,您查询对象的类型。如果没有真正的优化,你首先进行一个函数调用,然后调用它说它必须返回一个指向类型表的指针。在第二种情况下,这样的调用被省略:编译器将通过返回类型代码来专门化它。如果预先知道类型,它甚至可以非常快速地对其进行测试。还要注意ObjectisType可以针对一些简单的情况进行优化:例如因为编译器已经可以导出Objectcannot/alwaysbeType。更高级的还可以分析CIL虚拟机源码,对于第一个变体,这是:IL_0000:ldarg.0IL_0001:callvirtinstanceclass[mscorlib]System.Type[mscorlib]System.Object::GetType()IL_0006:ldtoken[mscorlib]System.Int32IL_000b:调用类[mscorlib]System.Type[mscorlib]System.Type::GetTypeFromHandle(valuetype[mscorlib]System.RuntimeTypeHandle)IL_0010:调用bool[mscorlib]System.Type::op_Equality(class[mscorlib]System.Type,class[mscorlib]System.Type)IL_0015:ret对于第二个变体,这是:IL_0000:ldarg.0IL_0001:isinst[mscorlib]System.Int32IL_0006:ldnullIL_0007:cgt.unIL_0009:ret(当然也可以填写其他类型)。现在ldarg.0和ret只是使用方法的副产品,因此可以忽略它们。我们看到的是,在第一个变体中,显式调用GetType方法,然后调用==运算符。函数调用通常很昂贵。在第二个变体中,它立即检查isinst。代码需要更少的字节并使用更便宜的方法。虽然性能当然取决于运行时环境的实现,但我认为第二种变体在性能方面几乎总是优于第一种变体是相当安全的。编译器可能能够专门化第一个变体,使其与第二个变体一样高效地运行,但MonoC#编译器似乎无法做到这一点。可能没有可用的C#编译器。以上就是C#学习教程:哪个好用:Object.GetType()==typeof(Type)orObjectisType?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
