데이터베이스에서 데이터를 검색하고 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에서 수집 한 가장 최근의 변경 사항으로 코드를 편집.
편집 내용이 제안 된 모든 변경 사항을 얻지 못했다는 점에 유의하십시오. 루프 마지막 부분에서 중요한 부분 인'objects [type] .Add' 대신'obj.Add'를 놓쳤습니다. –
@DanielHilgarth, 맞습니다! 나는 그것을 놓쳤을 것임에 틀림 없다, 미안 :. 게시물을 다시 편집했습니다. –