에서 ConcurrentDictionary.Count의 성능을 향상시키는 방법 최근에 SortedDictionary
과 SortedList
사이에서 선택하고 SortedList
에 정착해야했습니다.C#
그러나 이제는 수천 번 호출되는 함수/메서드를 사용하여 SortedList.Count를 검사 할 때 내 C# 프로그램이 느려지는 것을 발견했습니다.
보통 내 프로그램은 35ms 이내에 10,000 번 기능을 호출하지만 SortedList.Count
을 사용하는 동안은 기본적으로 10 배 느린 300-400ms로 느려졌습니다.
나는 또한 SortedList.Keys.Count
을 시도했지만, 이것은 내 성능을 또 다른 10 배나 3000 밀리 초로 줄였습니다.
I have only ~5000 keys/objects in SortedList<DateTime, object_name>
. 쉽게 정렬 된 목록에서 데이터를 SortedList[date] (in 35 ms)
까지 즉시 검색 할 수 있으므로 목록 구조 또는 해당 개체의 보유 관련 문제를 발견하지 못했습니다.
이 성능은 정상입니까?
목록에서 레코드 수를 얻거나 목록이 채워 졌는지 확인하기 위해 사용할 수있는 다른 방법은 무엇입니까? (내가 지금 할 수있는 별도의 추적 플래그를 추가 외에)
수정 : 미안 해요, 난 실제로 사용하고 있습니다, ConcurrentDictionary<string, SortedList<DateTime, string>> dict_list = new ConcurrentDictionary<string, SortedList<DateTime, string>>();
을 그리고 다양한 장소에서 다양한 수를 가지고 때로는 목록에있는 항목을 확인하고 ConcurrentDicitonary에서 다른 시간. 그래서이 문제는 ConcurrentDicitonary에 적용됩니다. 동시성을 사용하지 않고이 작업을 확인하기 위해 빠른 테스트 코드를 작성했습니다. 350 밀리 초가 소요됩니다. 다음은 350 MS 보여 ConcurrentDicitonary 테스트입니다 :
public static void CountTest()
{
//Create test ConcurrentDictionary
ConcurrentDictionary<int, string> test_dict = new ConcurrentDictionary<int, string>();
for (int i = 0; i < 50000; i++)
{
test_dict[i] = "ABC";
}
//Access .Count property 10,000 times
int tick_count = Environment.TickCount;
for (int i = 1; i <= 10000; i++)
{
int dict_count = test_dict.Count;
}
Console.WriteLine(string.Format("Time: {0} ms", Environment.TickCount - tick_count));
Console.ReadKey();
}
실제 질문은 다음과 같습니다. 자주? 너무 오래 걸린다 고 생각하면하지 마세요. 대신 변수에 저장하십시오. – HimBromBeere
목록이 채워 졌는지 확인하려는 경우 SortedList.Any()를 사용할 수 없습니까? – spersson
SortedList.Count는 전용 변수의 값을 반환하지만 느려질 수는 없습니다.LINQ Count() 메서드를 사용하고 있지 않습니까? – Evk