.net - 密封类真的提供性能优势吗?

标签 .net optimization frameworks performance

我遇到过很多优化技巧,它们说您应该将类​​标记为密封的以获得额外的性能优势。

我运行了一些测试来检查性能差异,但没有找到任何结果。难道我做错了什么?我是否错过了密封类(class)会产生更好结果的情况?

有没有人运行过测试并发现了差异?

帮我学习:)

最佳答案

答案是否定的,密封类的性能并不比非密封类好。

2021 年:现在的答案是肯定的,密封类会带来性能上的好处。

密封一个类可能并不总能提高性能,但 dotnet 团队正在采用密封所有内部类的规则,以便为优化器提供最佳机会。

详情请阅读https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-6/#peanut-butter

下面是旧答案。

问题归结为 callcallvirt IL 操作代码。 Callcallvirt快,callvirt主要用在不知道对象是否被子类化的时候。所以人们假设如果你密封一个类,所有的操作代码将从 calvirts 变为 calls 并且会更快。

不幸的是,callvirt 还做了其他一些有用的事情,比如检查空引用。这意味着即使一个类是密封的,引用可能仍然是空的,因此需要一个 callvirt。您可以解决这个问题(无需密封类(class)),但它变得有点毫无意义。

结构使用 call 因为它们不能被子类化并且永远不会为 null。

有关更多信息,请参阅此问题:

Call and callvirt

关于.net - 密封类真的提供性能优势吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3633614/

相关文章:

python - 迭代3个文件并在python中生成第三个文件的最佳方法

ios - 带有静态库的私有(private) pod 以及 swift pod

.net - 在 Linux/ARM 上使用 pinvoke 和 C 函数回调的 F# 委托(delegate)

c# - 直接使用 LINQ 修改值?

.net - 在哪里可以找到 .Net ORM 与数字或图表的比较?

C# 排序列表同时还返回原始索引位置?

使用求解器进行 Python 优化

c# - 自动优化 Windows 窗体 InitializeComponent 的性能

java - 在 Netbeans 7.3 中包含 Spring MVC

java - 如何在java中的任何二维数组中存储不同数据类型的多个字段?