我遇到过很多优化技巧,它们说您应该将类标记为密封的以获得额外的性能优势。
我运行了一些测试来检查性能差异,但没有找到任何结果。难道我做错了什么?我是否错过了密封类(class)会产生更好结果的情况?
有没有人运行过测试并发现了差异?
帮我学习:)
最佳答案
答案是否定的,密封类的性能并不比非密封类好。
2021 年:现在的答案是肯定的,密封类会带来性能上的好处。
密封一个类可能并不总能提高性能,但 dotnet 团队正在采用密封所有内部类的规则,以便为优化器提供最佳机会。
详情请阅读https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-6/#peanut-butter
下面是旧答案。
问题归结为 call
与 callvirt
IL 操作代码。 Call
比callvirt
快,callvirt
主要用在不知道对象是否被子类化的时候。所以人们假设如果你密封一个类,所有的操作代码将从 calvirts
变为 calls
并且会更快。
不幸的是,callvirt
还做了其他一些有用的事情,比如检查空引用。这意味着即使一个类是密封的,引用可能仍然是空的,因此需要一个 callvirt
。您可以解决这个问题(无需密封类(class)),但它变得有点毫无意义。
结构使用 call
因为它们不能被子类化并且永远不会为 null。
有关更多信息,请参阅此问题:
关于.net - 密封类真的提供性能优势吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3633614/