密封類真的能提供性能優勢嗎?
我遇到了很多優化技巧,它們說你應該將你的類標記為密封以獲得額外的性能優勢。
我進行了一些測試以檢查性能差異,但沒有發現。難道我做錯了什麼?我是否錯過了密封類會產生更好結果的情況?
有沒有人執行測試並看到了不同?
幫我學習:)
JITter 有時會對密封類中的方法使用非虛擬呼叫,因為它們無法進一步擴展。
關於呼叫類型、虛擬/非虛擬有復雜的規則,我並不了解它們,所以我無法為您真正概述它們,但如果您在Google上搜尋密封類和虛擬方法,您可能會找到一些關於該主題的文章。
請注意,您將從這一優化級別獲得的任何性能優勢都應被視為最後的手段,始終在算法級別進行優化,然後再進行程式碼級別的優化。
這是一個提到這一點的連結:Rambling on the seal關鍵字
答案是否定的,密封類的性能並不比非密封類好。
2021 年:現在的答案是肯定的,密封課程有性能優勢。
密封一個類可能並不總能提高性能,但 dotnet 團隊正在採用密封所有內部類的規則,以便為優化器提供最佳機會。
有關詳細資訊,您可以閱讀<https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-6/#peanut-butter>
下面的舊答案。
問題歸結為
callvscallvirtIL 操作碼。Call比 快callvirt,callvirt主要用於不知道對像是否被子類化的情況。所以人們假設如果你密封一個類,所有的操作碼都會從calvirts變為calls並且會更快。不幸的是
callvirt,它還有其他有用的東西,比如檢查空引用。這意味著即使一個類是密封的,引用可能仍然為空,因此callvirt需要 a。您可以解決這個問題(無需密封課程),但這變得有點毫無意義。使用結構
call是因為它們不能被子類化並且永遠不會為空。有關更多資訊,請參閱此問題: