【发布时间】:2016-12-23 08:54:25
【问题描述】:
最近,我需要在SortedDictionary 和SortedList 之间进行选择,最终选择了SortedList。
但是,现在我发现我的 C# 程序在执行 SortedList.Count 时速度变慢,我使用调用了数千次的函数/方法对其进行了检查。
通常我的程序会在 35 毫秒内调用该函数 10,000 次,但是在使用 SortedList.Count 时,它会减慢到 300-400 毫秒,基本上慢了 10 倍。
我也尝试了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 毫秒,而不使用并发。
这是使用 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();
}
【问题讨论】:
-
SortedList.Count 只是返回私有变量的值,不能慢。你确定你没有使用 LINQs Count() 方法吗?
-
这是来自Reference Source的
Countpublic virtual int Count { get { return _size; } }的代码。 -
那么,您性能缓慢的原因在其他地方,而不是在 Count 调用中。
-
如果您提供可验证的示例,也许我们可以提供帮助。
-
SortedList<T>.Count的实现实际上是return _size;,因此您没有按照您认为的时间进行计时。您必须提供一个小型复制品。
标签: c# performance concurrentdictionary concurrent-collections