基类中的非虚拟 C# 方法仍然会产生 vtable 开销吗?

问题描述 投票:0回答:2

考虑到 C# 是为了最大性能而编写的,我们可以通过两种方式拥有基类方法(注意:我们这里讨论的是无状态类,没有字段,只有方法):

  • 实例类 A 为类 B 的继承/扩展提供基础 - 通常的模式
  • 静态类 A 具有静态方法(纯函数),由“扩展器”类 B 静态调用

我喜欢选项A,因为它使关系更加清晰。我想知道的是,如果所有这些基类方法都是非虚拟的,即在基类 A 中它们已经不能被覆盖,是否有 vtable 调用?显然,“非虚拟”意味着没有,但如果有任何开销,我想知道。

c# performance static instance vtable
2个回答
1
投票

根据@HansPassant(非常感谢),

即使是对实例方法的非虚拟调用也是使用精确的 相当于虚拟调用。放弃一点性能以获得非常好的效果 保证,调用站点始终会引发 NullReferenceException。 当它为空时诊断 NRE 是相当难看的。

只有对静态方法的调用才是非虚拟的。顺便说一句,这包括扩展方法。


0
投票

更新

在此 JIT 部分中搜索“去虚拟化”,了解从 .NET 6 开始可用的改进: https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-6/#jit

另请参阅
密封类真的能带来性能优势吗?

https://stackoverflow.com/a/53785972/19497610

© www.soinside.com 2019 - 2024. All rights reserved.