C# 如何提高C中ConcurrentDictionary.Count的性能#

C# 如何提高C中ConcurrentDictionary.Count的性能#,c#,performance,concurrentdictionary,concurrent-collections,C#,Performance,Concurrentdictionary,Concurrent Collections,最近,我需要在使用SortedDictionary和SortedList之间进行选择,然后选择SortedList 然而,现在我发现我的C#程序在执行SortedList.Count时慢得像爬行一样,我使用一个名为数千次的函数/方法来检查它 通常我的程序会在35毫秒内调用该函数10000次,但在使用SortedList.Count时,它会慢到300-400毫秒,基本上慢10倍 我还尝试了SortedList.Keys.Count,但这又使我的性能降低了10倍,达到3000毫秒以上 我在Sorte

最近,我需要在使用
SortedDictionary
SortedList
之间进行选择,然后选择
SortedList

然而,现在我发现我的C#程序在执行SortedList.Count时慢得像爬行一样,我使用一个名为数千次的函数/方法来检查它

通常我的程序会在35毫秒内调用该函数10000次,但在使用
SortedList.Count
时,它会慢到300-400毫秒,基本上慢10倍

我还尝试了
SortedList.Keys.Count
,但这又使我的性能降低了10倍,达到3000毫秒以上

我在SortedList中只有约5000个键/对象
。 我可以通过
SortedList[date](35毫秒)
轻松、即时地从已排序的列表中检索数据,因此我没有发现列表结构或其保存的对象有任何问题

这个表演正常吗

我还可以使用什么来获取列表中的记录数,或者只是检查列表是否已填充? (除了添加一个单独的跟踪标志,我现在可以这样做)

更正: 对不起,我实际上正在使用:
ConcurrentDictionary dict_list=新建ConcurrentDictionary()
我在不同的地方进行了不同的计数,有时检查列表中的项目,有时检查并发目录中的项目。因此,这个问题适用于ConcurrentDicitonary,我编写了快速测试代码来确认这一点,这需要350毫秒,而不使用并发。
以下是ConcurrentDicitonary测试,显示为350 ms:

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();
}
publicstaticvoidcounttest()
{
//创建测试ConcurrentDictionary
ConcurrentDictionary测试_dict=新建ConcurrentDictionary();
对于(int i=0;i<50000;i++)
{
测试指令[i]=“ABC”;
}
//访问权限。将属性计数10000次
int tick_count=Environment.TickCount;

对于(inti=1;i那么,
ConcurrentDictionary
必须同时对多个线程正常工作,因此需要一些同步开销

Count
属性的源代码:

公共整数计数
{
[SuppressMessage(“Microsoft.Concurrency”,“CA8001”,justify=“Concurrency Cop只是不知道这些锁”)]
得到
{
整数计数=0;
int acquiredLocks=0;
尝试
{
//获取所有锁
AcquireAllLocks(参考acquiredLocks);
//计算计数,我们允许溢出
对于(int i=0;i

看起来您需要重构现有代码。由于您没有提供任何代码,我们无法告诉您可以优化什么。

对于性能敏感的代码,我不建议使用
ConcurrentDictionary。计数
属性,因为它有一个锁定实现。您可以使用
Interlocked.Increment
来执行以下操作e数一数你自己。

这建议改称此为:

dictionary.Skip(0).Count()
从方法返回调用后,计数可能立即无效。例如,如果要将计数写入日志以进行跟踪,可以使用其他方法,如无锁枚举器


SortedList.Count只返回私有变量的值,不能太慢。确定没有使用LINQs Count()方法吗?这是
Count
public virtual int Count{get{return\u size;}的代码
from。那么,您执行缓慢的原因是其他地方,而不是Count调用。如果您提供了可验证的示例,也许我们可以提供帮助。
SortedList.Count
的实现实际上是
return\u size;
所以您没有在计时您认为正在计时的东西。您必须提供一个小的重新计时his是一个大型系统,我在
ConcurrentDictionary
中缓存来自多个来源的数据,然后每个提供者都检查数据是否已经加载。但总体而言,我在不同的地方以各种方式使用
ConcurrentDictionary
SortedList
,了解并发含义。但是,缓慢的计数并没有改变请将我解聘,我正在寻找一个最简单的替代者……注意,我在填充和访问它们方面从来没有遇到过问题,因此,除了计数之外,一切都表现得很好,这似乎很奇怪。我在几周前添加了计数,然后花了几天时间寻找我的系统慢到爬行的原因。我希望其他人甚至不会简单地意识到这一点使用Count可能会严重影响性能。@KonRad:我仍然不明白。每个提供程序都在调用
Count
,然后如果
Count>0
,它会尝试加载一些Entire吗?
dictionary.Skip(0).Count()