虚拟方法的调用速度比非虚拟方法慢

本文关键字:虚拟 方法 调用 速度 | 更新日期: 2023-09-27 18:26:01

我一直在学习虚拟方法以及如何调用它们。正如在这里和这里讨论的那样,我得出的结论是,它们实际上不应该有那么大的不同。

C#编译器发出IL代码,该代码通过call IL指令调用静态方法,并通过callvirt调用虚拟/非虚拟成员。JIT的工作似乎是弄清楚从中调用方法的对象是否真的为null。因此,两者的检查是相同的。

此外,正如第一篇文章中所讨论的,在编译时,保存方法定义元数据的vtables或表似乎是扁平的。换句话说,这些表准确地包含了对象应该调用的方法,而不需要在继承链上进行递归搜索。

既然如此,为什么虚拟方法被认为速度较慢?也许一个级别的间接(如果有的话)有那么大的意义吗?请解释。。。

虚拟方法的调用速度比非虚拟方法慢

您正在研究具有直接寻址和间接寻址的函数调用指令之间的区别。但是,间接函数调用的大部分"成本"不是调用本身,而是失去了执行优化的机会,这需要对目标的静态了解。内嵌、跨过程混叠分析等。

弄清楚要执行的实际方法实现将有一些成本,而不是仅仅知道。这种成本可能非常小,而且对于任何特定的上下文来说,成本很可能完全可以忽略不计,因为它真的不需要那么长。但成本是非零的,因此在对性能特别敏感的应用程序中,它会使产生一些的差异。