2016-01-31 55 views
3

該文檔recommend註冊通過lambda表達式作爲頻繁使用的組件...爲什麼lambda解決得更快?

這可以產生高達10個的速度更快Resolve()電話

現在的改善顯然有幾個問題:

  1. 爲什麼呢? (編輯:澄清:我會明白,如果註冊時間上升,因爲你現在必須使用反射來找到正確的構造函數等等,但爲什麼解決時間?)
  2. 在哪種情況下申請/註冊課程的哪些方面使這個數字上升/哪些使其下降?
  3. 無論如何,我們一般都在談論什麼是解決時間?像「現在需要100個而不是10個cpu週期」,或者在「正常」用例(具有按請求生命期的Web服務)中實際可測量的數字?
+0

水泥混凝土實現總是比仿製藥或反射更快。在通用用法上,很多反射正在使用的背景中。而且速度較慢。 在大多數正常情況下,您無法感受到其中的差異。你可以給它發信息。由於緩慢的影響,您應該經常避免使用反射或泛型,因此需要重用已使用的代碼(如算法)。 但是:「過早優化是萬惡之源」。讓它起作用。如果需要的話,讓它工作得很快。 – Ben

+0

@Ben是的,我意識到這一點,但我會認爲這是花費在註冊時間,而不是解決時間(因爲一旦我找到了正確的構造函數 - 可以在註冊時完成 - 我可以調用'''Activator .CreateInstance''')。這讓我感到困惑。 – FrankyBoy

回答

3

正如在評論中指出的那樣,簡短的版本是具體的實現將比解析的反射方式更快。

深入考察,想想參與每一個步驟。

LAMBDA:

  1. 執行該方法。
  2. 沒有第二步。

反思:

  1. 枚舉所有構造函數的類型被實例化。這個列表可以被緩存,但已經被.NET框架很好地緩存了。
  2. 所有可用的構造函數中,計算出執行基於可用的構造參數的數量,並在容器中註冊的類型是哪一個。注意在可以基於註冊來源,壽命範圍登記改變容器登記的類型等
  3. 解決的構造參數。如果有基於反射的註冊組成構造參數,請遞歸地通過此過程運行它們。
  4. 使用已解析的參數調用選定的構造函數。

正如你看到的,實際上不僅僅是Activator.CreateInstance解決,這就是爲什麼它需要更長的時間的思考方式更多的工作。

但是,正如在評論中還指出,不用擔心過早的優化。這一切都很快就會發生,因此請等待優化,直到使用探查器或類似工具實際找到瓶頸爲止。

+0

嗨!感謝這個偉大的答案。考慮到第二點明確了爲什麼還有更多的工作正在進行,爲什麼在註冊時無法完成。 關於3 - >當然,如果你需要解決任何問題,也適用於lambda表達式;) – FrankyBoy

+0

哦,關於過早優化:不用擔心,我現在只是試圖深入一點autofac(因爲我們使用的方式它吮吸),偶然發現,並且只是好奇。我們有更多的領域需要首先考慮績效。 – FrankyBoy

相關問題