2011-11-04 92 views
1

我在我目前一流的設計使用一些功能,如C#COMDelegate :: DelegateConstruct優化

ICollection<ICache> caches = new HashSet<ICache>(); 

    ICollection<T> Matches<T>(string dependentVariableName) 
    { 
     return caches 
      .Where(x => x.GetVariableName() == dependentVariableName) 
      .Where(x => typeof(T).IsAssignableFrom(x.GetType())) 
      .Select(x => (T) x) 
      .ToList(); 
    } 

。它們從體系結構的角度出色地工作 - 我可以在其中隨意添加各種相關類型的對象(在本例中爲ICaches),並將它們作爲具體類型的集合來檢索。

一個問題是,這裏的框架是一個科學軟件包,這些功能位於非常熱門的代碼路徑上,在幾分鐘內被調用數千次。其結果是:像上面

Screen shot of profiling

和功能是COMDelegate :: DelegateConstruct的主要消費者。

正如您從樣本%的相對分佈中可以看到的那樣,這不是一個交易斷路器,但它可以減少一點開銷!

在此先感謝。

回答

0

1)我沒有看到你發佈的代碼是如何與性能數據相關的......列出的函數看起來不像他們從這個代碼中調用。所以我真的不能回答你的問題,只能說你可能是在解釋他的表現報告錯誤。

2)不要在最後調用.ToList ...只是返回IEnumerable。這將有助於表現。只有做ToList當你真的需要,你可以在以後添加/刪除/排序事情的清單。

3)我沒有足夠的背景,但似乎這種方法可以通過利用dynamic關鍵字被淘汰

+0

所以#2我可以馬上改變(謝謝)。 R/E#1,我知道這個LINQ表達式與DelegateConstruct調用有關,因爲性能報告中的「此函數被調用......」功能(更不用說這一行被標記爲「熱代碼路徑」)。 我正在閱讀:http://msmvps.com/blogs/jon_skeet/archive/2011/08/23/optimization-and-generics-part-2-lambda-expressions-and-reference-types.aspx和想知道我的問題是否與在Lambda表達式中使用泛型參數有關?我會認爲IsAssignableFrom會被緩存? – D3C34C34D

+0

另外,如果你想拉代碼,它在這裏的github上: https://github.com/JLospinoso/sie/blob/master/SienaDotNet/Modeling/Caches/Repository/CacheHashSet.cs – D3C34C34D