getfield - c# reflection class



.NET反射成本如何? (9)

我經常聽到反射有多糟糕。 雖然我通常避免反思,很少會發現無法解決問題的情況,但我想知道......

對於那些在應用中使用過反射的人,你是否測量過性能點擊,是否真的很糟糕?


Jeff Richter在他的演講“日常生活中的表現”中表明,通過反思調用一種方法比正常調用慢1000倍

Jeff的提示:如果您需要多次調用該方法,請使用反射一次來找到它,然後將其分配給委託 ,然後調用委託。


不是大規模。 我從來沒有在桌面開發中遇到過一個問題,除非像Martin說的那樣,你在一個愚蠢的地方使用它。 我聽說很多人對其在桌面開發方面的表現完全無理性的擔憂。

精簡版框架 (我通常使用的框架 )中,它非常具有anathema ,在大多數情況下應該避免像瘟疫一樣。 我仍然可以不經常使用它,但是我必須非常小心它的應用程序,它不那麼有趣。 :(


反射是昂貴的,因為每當您請求匹配參數列表的方法時,運行時必須進行許多檢查。 在內部深處,代碼存在循環遍歷類型的所有方法,驗證其可見性,檢查返回類型並檢查每個參數的類型。 所有這些東西都需要花費時間。

當你在內部執行該方法時,會執行一些代碼,比如在執行實際的目標方法之前檢查你傳遞了一個兼容的參數列表。

如果可能的話,總是建議一個緩存方法句柄,如果有人將來不斷重用它的話。 像所有優秀的編程技巧一樣,避免重複自己常常是有道理的。 在這種情況下,不斷查找具有某些參數的方法,然後每次都執行它會是浪費。

打開源文件並查看正在做什麼。


如果你不在循環中,不要擔心。


它是。 但這取決於你想要做什麼。

我使用反射動態加載程序集(插件),其性能“損失”不是問題,因為該操作是我在應用程序啟動過程中所做的。

但是,如果你在每個反射調用中反射一系列嵌套循環,我會說你應該重新訪問你的代碼:)

對於“幾次”操作,反射是完全可以接受的,並且您不會注意到任何延遲或問題。 這是一個非常強大的機制,它甚至被.NET使用,所以我不明白為什麼你不應該試一試。


已經夠糟糕的是,即使關於.NET庫對於性能關鍵代碼的內部反射,你也不得不擔心。

以下示例已過時 - 在當時是正確的(2008),但很久以前已在更新的CLR版本中修復。 雖然一般的反思仍然是一個有點昂貴的事情!

案例:您絕對不應該在高性能代碼中的鎖(C#)/ SyncLock(VB.NET)語句中使用聲明為“Object”的成員。 為什麼? 由於CLR無法鎖定值類型,這意味著它必須執行運行時反射類型檢查,以查看您的對像是否實際是值類型而不是引用類型。


我最相關的經驗是編寫代碼來比較大型對像模型中相同類型的任何兩個數據實體。 得到它的工作,嘗試它,顯然是像狗一樣跑。

我很沮喪,然後一夜之間意識到不改變邏輯,我可以使用相同的算法來自動生成方法進行比較,但靜態訪問屬性。 為了達到這個目的,我們沒有花時間去調整代碼,並且我有能力對靜態代碼進行深層次的屬性比較,只要對像模型發生變化,只需點擊一下按鈕即可對其進行更新。

我的觀點是:在與同事的對話中,我多次指出,他們使用反射可能會自動生成代碼來編譯而不是執行運行時操作,這經常值得考慮。


與所有事情一樣,這都是關於評估情況的。 在DotNetNuke有一個稱為FillObject的相當核心的組件,它使用反射來填充數據行中的對象。

這是一個相當常見的場景,並且有一篇關於MSDN的文章, 使用反射將業務對象綁定到ASP.NET表單控件 ,以涵蓋性能問題。

除了性能之外,我不喜歡在特定場景中使用反射的一點是,它會降低快速了解代碼的能力,對於我來說,如果您認為自己也會失去編譯功能而不是強類型數據集或類似LINQ to SQL


反射性能取決於實現(重複調用應該被緩存,例如: entity.GetType().GetProperty("PropName") )。 由於我每天都會看到大多數反射用於從數據讀取器或其他存儲庫類型結構中填充實體,因此我決定在用於獲取或設置對象屬性時專門針對反射進行性能基準測試。

我設計了一個我認為公平的測試,因為它緩存了所有重複調用,並且只調用了實際的SetValue或GetValue調用。 性能測試的所有源代碼位於: https://bitbucket.org/grenade/accessortest ://bitbucket.org/grenade/accessortest。 審查受到歡迎和鼓勵。

我得出的結論是,它是不實際的,並且不會提供顯著的性能改進,以便在反射實現完成時一次返回少於100,000行的數據訪問層中移除反射。

上面的圖表顯示了我的小基準的輸出結果,並且顯示了超過反射的機制,僅在100,000個週期後顯著。 大多數DALs一次只能返回數百或者甚至數千行,並且在這些級別反射執行得很好。





reflection