在 dotnet 裡面,拿到一個指針,可以有多個不同的方法轉換為結構體,本文将來告訴大家這幾個方法的性能的差别
特别感謝性能優化狂魔 Stephen Toub 大佬的指導
在 WPF 架構開發中,有小夥伴 ThomasGoulet73 問 Stephen Toub 大佬關于從指針轉換為結構體的性能差别,請看 https://github.com/dotnet/wpf/pull/4917#discussion_r690587610
此時 Stephen Toub 大佬給出的性能測試如下

通過 Cast 轉換的性能是最佳的,但是需要用上不安全代碼,使用的時候也有很多注意的事項。而采用 Marshal 的 PtrToStructure 有兩個重載的方法,一個是泛型的,一個是非泛型的,測試代碼如下
在 Stephen Toub 大佬的建議是,雖然 Cast 方法,通過不安全代碼指針轉換的方法的性能足夠好,如上面測試 隻需 0.0477 納秒,但是隻有在類型是 blittable(可直接複制到本機結構中的類型)的時候才适合用強轉的方式。否則還是需要使用 Marshal 的方法處理封送
一個有趣的事情是 PtrToStructure 的泛型的和非泛型的方法實作基本一緻,如下面代碼
可以看到泛型的版本其實就是強轉一下傳回而已
本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協定進行許可。歡迎轉載、使用、重新釋出,但務必保留文章署名林德熙,不得用于商業目的,基于本文修改後的作品務必以相同的許可釋出。如有任何疑問,請與我