我一直在阅读虚拟方法以及它们是如何被调用的。正如所讨论的here和here,我已经得出结论,他们不应该真的如此不同。虚拟方法比非虚拟方法要慢
C#编译器发出IL代码,该代码通过call
IL指令调用静态方法,并通过callvirt
调用虚拟/非虚拟成员。看起来JIT的工作实际上是确定被调用的方法对象是否实际为空。所以这两项检查都是一样的。另外,正如在第一篇文章中讨论的那样,在编译时,看起来vtables或者表格保存着方法定义的元数据,在编译时被展平了。换句话说,这些表确切地包含了对象应该调用的方法,而不需要对继承链进行递归搜索。
综上所述,为什么虚拟方法被认为比较慢?也许是一个间接的(如果有的话)那么大的一笔交易?请解释...
* CLR只通过调用IL指令调用静态方法*是有误导性的。它是C#编译器,它为静态和'callvirt'发出'call'指令作为实例方法。其他编译器可以自己的方式自由地实现它。 CLR与此无关。 – 2014-10-09 15:14:38
@SriramSakthivel真。我会换个话。 – 2014-10-09 15:15:52
相关:http://stackoverflow.com/questions/530799/what-are-the-performance-implications-of-marking-methods-properties-as-virtual – 2014-10-09 15:28:53