最近,我需要在使用
然而,现在我发现我的C#程序在执行SortedList.Count时变得非常缓慢,我使用了一个被调用了成千上万次的函数/方法进行检查。
通常情况下,我的程序会在35毫秒内调用该函数10000次,但是使用
我还尝试了
我在
这种性能正常吗?
除了添加单独的跟踪标志(我暂时可能会这样做),还可以使用什么来获取列表中记录的数量或仅检查列表是否填充?
更正:
抱歉,实际上我正在使用:
SortedDictionary
和SortedList
之间做出选择,并决定使用SortedList
。然而,现在我发现我的C#程序在执行SortedList.Count时变得非常缓慢,我使用了一个被调用了成千上万次的函数/方法进行检查。
通常情况下,我的程序会在35毫秒内调用该函数10000次,但是使用
SortedList.Count
时,它变慢了10倍,变成了300-400毫秒。我还尝试了
SortedList.Keys.Count
,但这使我的性能再次降低了10倍,超过了3000毫秒。我在
SortedList<DateTime, object_name>
中只有约5000个键/对象。我可以通过SortedList[date] (在35毫秒内)
轻松快速地从我的排序列表中检索数据,所以我没有发现任何与列表结构或其持有的对象有关的问题。这种性能正常吗?
除了添加单独的跟踪标志(我暂时可能会这样做),还可以使用什么来获取列表中记录的数量或仅检查列表是否填充?
更正:
抱歉,实际上我正在使用:
ConcurrentDictionary<string, SortedList<DateTime, string>> dict_list = new ConcurrentDictionary<string, SortedList<DateTime, string>>();
我在不同的地方有各种计数,有时检查列表中的项,有时检查ConcurrentDicitonary中的项。因此,这个问题适用于ConcurrentDicitonary,并且我编写了快速测试代码来确认这一点,它需要350毫秒,而没有使用并发。以下是使用ConcurrentDicitonary的测试,显示需要350毫秒: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();
}
Count
属性的代码:public virtual int Count { get { return _size; } }
,可以在 Reference Source 中找到。它返回_size
的值,表示当前SortedList
中元素的数量。 - Alessandro D'AndriaSortedList<T>.Count
的实现字面上是return _size;
,因此你计时的不是你认为的内容。你需要提供一个简短的重现代码。 - Matthew Watson