「as」運算子和可空類型的效能驚喜
《C# 深度》第4 章中,正在討論可空型別和「as」運算符。具體來說,期望使用“as”進行類型檢查可以比傳統的“is”檢查和轉換提高效能,因為它將流程簡化為單一類型檢查和值檢查。然而,我們觀察到了令人驚訝的結果。
效能基準測試
為了評估效能,進行了基準測試,其中涉及對包含大量空引用和字串引用的物件陣列中的整數進行求和。此測試測量了以下程式碼片段的執行時間:
- 使用「is」和轉換的 C# 1風格程式碼
- 使用「as」運算子
- LINQ解決方案
LINQ解決方案
LINQ解決方案
LINQ解決方案
LINQ解決方案
LINQ解決方案
LINQ解決方案
LINQ解決方案讓研究人員🎜>令研究人員驚訝的是,C# 1 程式碼的效能明顯優於「as」程式碼和LINQ 程式碼。 結果分析效能差異歸因於以下原因因素:JIT 編譯器對「is」和強制轉換的最佳化:「is」運算子測試和後續強制轉換可以透過JIT 編譯器進行最佳化,從而獲得高效的機器以最少的指令執行的程式碼。這種最佳化是可能的,因為裝箱值類型可以直接拆箱為相同類型的變量,而無需任何值轉換或複製。 轉換為 Nullable
的複雜度: 轉換為 int?使用“as”需要更複雜的轉換過程,因為裝箱整數的值表示與 Nullable 的記憶體佈局不同。這需要使用名為 JIT_Unbox_Nullable 的通用拆箱輔助函數,該函數由於其通用性質和類型檢查而引入了額外的開銷。 LINQ 的意外行為:OfType LINQ 中的 () 擴充方法也利用「is」運算子和 JIT_Unbox() 輔助函數。然而,它的性能與 Nullable 的“as”轉換相當,儘管預期它應該更便宜。這種差異可能歸因於 ngen.exe 引起的潛在問題。 結論雖然「as」運算子提供了一種便捷的方法來執行類型檢查和可空值處理,但其效能特徵在具體場景中可能並不總是如預期的那樣。在涉及大量拆箱操作的情況下,C# 1 中為「is」和轉換產生的最佳化程式碼仍然明顯更快,這凸顯了在選擇編碼技術時考慮效能影響的重要性。 以上是對於 C# 中的可空類型,「as」運算子是否始終比「is」提供效能優勢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!