2011-11-04 1 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(); 
    } 

같은 몇 가지 기능을 사용하고 있습니다. 그들은 아키텍처 관점에서 훌륭하게 작동합니다. 다양한 관련 유형 (이 경우 ICache)의 객체를 임의로 추가하고 구체적인 유형의 컬렉션으로 검색 할 수 있습니다.

여기서 프레임 워크는 과학적인 패키지이며 이러한 종류의 기능은 몇 분 동안 수천 번 호출되는 매우 뜨거운 코드 경로에 놓여 있다는 것이 문제입니다. 그 결과, 위의 같은

Screen shot of profiling

과 기능이 COMDelegate :: DelegateConstruct의 주요 소비자이다.

샘플 %의 상대 분포에서 알 수 있듯이 이것은 거래 차단기가 아니지만 오버 헤드를 약간 줄이는 것이 환상적입니다!

미리 감사드립니다.

답변

0

1) 나는 성능 데이터와 관련하여 코드를 게시하는 방법을 보지 못했습니다 ... 나열된 함수는이 코드에서 전혀 호출되지 않습니다. 그래서 정말 당신의 질문에 답할 수 없습니다. 아마도 당신은 그가 성과보고를 잘못 해석하고 있다고 말할 것입니다.

2) 끝에서 .ToList를 호출하지 말고 그냥 IEnumerable을 반환하십시오. 성능 향상에 도움이됩니다. 단지 내가 충분히 문맥을 필요 없다). 당신은 정말 당신이 나중에에/정렬 일을 추가/제거 할 수있는 목록이 필요 할 때

3 ToList을 할 수 있지만,이 방법은 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 그리고 내 문제가 람다 식 내에서 일반적인 주장의 사용과 관련이 있는지 궁금해하십니까? 나는 IsAssignableFrom이 캐시 될 것이라고 생각 했을까? – D3C34C34D

+0

또한 코드를 풀려면 여기를 github : https://github.com/JLospinoso/sie/blob/master/SienaDotNet/Modeling/Caches/Repository/CacheHashSet.cs – D3C34C34D