Dot-Net

密封類真的能提供性能優勢嗎?

  • August 5, 2008

我遇到了很多優化技巧,它們說你應該將你的類標記為密封以獲得額外的性能優勢。

我進行了一些測試以檢查性能差異,但沒有發現。難道我做錯了什麼?我是否錯過了密封類會產生更好結果的情況?

有沒有人執行測試並看到了不同?

幫我學習:)

JITter 有時會對密封類中的方法使用非虛擬呼叫,因為它們無法進一步擴展。

關於呼叫類型、虛擬/非虛擬有復雜的規則,我並不了解它們,所以我無法為您真正概述它們,但如果您在Google上搜尋密封類和虛擬方法,您可能會找到一些關於該主題的文章。

請注意,您將從這一優化級別獲得的任何性能優勢都應被視為最後的手段,始終在算法級別進行優化,然後再進行程式碼級別的優化。

這是一個提到這一點的連結:Rambling on the seal關鍵字

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

2021 年:現在的答案是肯定的,密封課程有性能優勢。

密封一個類可能並不總能提高性能,但 dotnet 團隊正在採用密封所有內部類的規則,以便為優化器提供最佳機會。

有關詳細資訊,您可以閱讀<https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-6/#peanut-butter>

下面的舊答案。

問題歸結為callvs callvirtIL 操作碼。Call比 快callvirtcallvirt主要用於不知道對像是否被子類化的情況。所以人們假設如果你密封一個類,所有的操作碼都會從calvirts變為calls並且會更快。

不幸的是callvirt,它還有其他有用的東西,比如檢查空引用。這意味著即使一個類是密封的,引用可能仍然為空,因此callvirt需要 a。您可以解決這個問題(無需密封課程),但這變得有點毫無意義。

使用結構call是因為它們不能被子類化並且永遠不會為空。

有關更多資訊,請參閱此問題:

呼叫和呼叫virt

引用自:https://stackoverflow.com/questions/2134