2012-08-29 1 views
1

데이터베이스에서 데이터를 검색하고 C#의 ExpandoObjects를 통해 데이터에서 개체를 만드는 고급 프로그램이 있습니다.사전 최적화 C#의 ExpandoObjects 추가

저는 현재 전체 프로세스를 최적화하는 과정에 있지만 성능상의 병목 현상이었던 코드 조각이있었습니다. 나는 furhter이 코드 조각을 최적화하는 방법까지 매우 궁금 이미 빠른 속도로 다음을 수행하여 그것을 3 번 실행 관리 :에 대한 별도의

  • 구분 '발견'유형 '섹션'을 루프를 만들고 아직 초기화하지 않은 경우에만 반복합니다.
  • Null 값을 추가 할 때 어떤 이유로 Dictionary.Add가 상당히 느려지므로 값이 null 일 때 대신 빈 문자열을 만드는 경우를 추가했습니다.

    // Holds all objects that are created inside the object. 
        Dictionary<string, IDictionary<string, dynamic>> objects = new Dictionary<string, IDictionary<string, dynamic>>(); 
    
        // This foreach loop is the slowest part! 
        foreach (KeyValuePair<string, dynamic> pair in fields) 
        { 
         string type = pair.Key.Split('_')[0]; 
    
         IDictionary<string, dynamic> obj; 
         if (!objects.TryGetValue(type, out obj)) 
         { 
          obj = new ExpandoObject(); 
          objects.Add(type, obj); 
         } 
         int location = pair.Key.IndexOf(type + "_"); 
         string key = pair.Key.Remove(location, type.Length + 1); 
         if (pair.Value == null)   // If Value is null, replace it with an empty string (dictionary slows quite alot when passing it null values) 
          obj.Add(key, ""); 
         else 
          obj.Add(key, pair.Value);   
        } 
    
        if (types == null) 
         types = objects.Select(x => x.Key).ToList(); 
    

궁금하고, 어떻게 널 값을 추가 할 때 그 사전은 null 값을 발생하는 경우 기본 구조에 특별한 작업을 수행한다는 것입니다, 그 정도 속도가 느려입니까? 그리고 코드를 최적화하기 위해 내가 놓친 것이 있습니까?

도움을 주시면 다시 한 번 감사드립니다.


  • UPDATE 내가 SO에서 수집 한 가장 최근의 변경 사항으로 코드를 편집.
+0

편집 내용이 제안 된 모든 변경 사항을 얻지 못했다는 점에 유의하십시오. 루프 마지막 부분에서 중요한 부분 인'objects [type] .Add' 대신'obj.Add'를 놓쳤습니다. –

+0

@DanielHilgarth, 맞습니다! 나는 그것을 놓쳤을 것임에 틀림 없다, 미안 :. 게시물을 다시 편집했습니다. –

답변

2

당신은 TryGetValue 대신 ContainsKey를 사용하여 사전에 여러 조회를 방지 할 수 있습니다

foreach (KeyValuePair<string, dynamic> pair in fields) 
{ 
    string type = pair.Key.Split('_')[0]; 

    IDictionary<string, dynamic> obj; 
    if (!objects.TryGetValue(type, out obj)) 
    { 
     obj = new ExpandoObject(); 
     objects.Add(type, obj); 
    } 
    int location = pair.Key.IndexOf(type + "_"); 
    string key = pair.Key.Remove(location, type.Length + 1); 
    if (pair.Value == null) 
     obj.Add(key, ""); 
    else 
     obj.Add(key, pair.Value);    
} 

을 BTW : 나는 당신이 두 번째 foreach 루프 types를 사용하여 표시되지 않습니다. 따라서 당신은이 간단한 코드로 foreach 루프를 대체 할 수는 types 목록에서 느린 검색 및 유형의 이중 분석을 제거로서 이것은 꽤 많은 시간을 저장해야

types = objects.Select(x => x.Key).ToList(); 

.

분명히 위의 그림은 foreach 루프 다음에 올 필요가 있습니다.

+0

물론! 그 사전의 사용을 잊어 버렸습니다. 감사! –

+0

@JoeyDewd : 업데이트를 참조하십시오. –

+0

감사합니다. 속도면에서는별로 개선되지 않았지만 코드는 확실히 정리되었습니다. :) –

관련 문제