2014-05-10 99 views
4

我一直在閱讀了很多關於發射和更快它是如何比反射快多了,但一直沒能找出原因。我明白髮射是注入IL代碼,但爲什麼這種速度比反射時做像ORM一樣的屬性映射?爲什麼排放超過反射

參照這種用例: Emit mapper vs valueinjecter or automapper performance

+2

你在哪裏讀的?當我們不知道究竟是什麼時,很難解釋或迴應索賠。如果源是一個網頁鏈接到它。如果是一本書,請引用相關文字。 –

+0

與源代碼一起更新。謝謝! – drac64

+0

因爲你停止使用反射。 –

回答

5

思考使用通用代碼和元數據來執行其操作。反射調用通常會進行很多運行時檢查,例如,如果您要訪問的屬性確實屬於您提供的對象的類型。或者你想傳入一個方法的參數與簽名是兼容的。當然還有很多拳擊和拆箱,因爲所有東西都只是作爲一個對象來對待。

在另一方面反射發出生成代碼專門爲要執行的任務,在編譯期間檢查了很多事情只有一次,然後將執行一樣快,你每次都寫在源代碼代碼。

有明顯動態生成的代碼相當一些開銷,但如果你這樣做一次,然後使用此代碼很多時候它會在長期更快。正則表達式是一樣的。你可以使用它們,你的表達式在操作過程中基本上會被解釋,但是如果你必須多次使用相同的表達式,你可以指定編譯選項,並且庫會產生適合你的表達式的代碼,然後你可以直接執行它每次都需要解釋表達式。

因此,在本質反射像解釋代碼,反射發射是(像)編譯它。