4

我正在使用一个框架,该框架使用从System.Collections.CollectionBase. 用户一直在抱怨性能,我觉得这些使用非常频繁的集合可能是问题的很大一部分。有没有一种方法可以使用工具或分析器或在 IL 中获得一些关于装箱/拆箱处罚的指标?我需要证据来支持推动System.Collections.Generic。我已经尝试过 CLRProfiler,但往往会迷路并且不确定我应该寻找什么。

更新
感谢大家迄今为止的意见。我知道这可能不是主要瓶颈,但我正在寻找尽可能多的性能杀手的指标。这只是其中之一,不确定它有多大,因此寻找一种方法来测量它。

4

4 回答 4

10

虽然出于很多充分的理由我当然鼓励您从非泛型集合转移到泛型集合,但老实说,我怀疑这些集合可能是您的性能问题的原因。拳击通常只有在您达到微观水平时才会成为问题,需要在高性能情况下挤出微小的收益。出于 GC 的原因,通常避免这种情况也很好,但在那个领域通常也是次要的。

换句话说:装箱会导致您的用户会注意到的性能问题,这是非常值得怀疑的。

显然,我是在概括地说。在不知道你的具体情况的情况下,我真的不能肯定地说那么多。


编辑:请注意,虽然我怀疑您的问题可能是您使用非泛型集合本身,但我会指出,您使用什么类型的集合来解决给定问题非常重要,特别是当数据量在收藏品很大。这里只是几个例子:

  • 例如,如果您正在基于键执行查找,则诸如哈希表之类的哈希表Dictionary<TKey, TValue>显着优于List<T>
  • 如果您正在检查重复项,则 aHashSet<T>将具有出色的性能。
  • 如果您正在寻找FIFO(类似队列)的行为,aQueue<T>将具有卓越的性能。
  • 如果您在集合中的随机位置执行插入/删除,aLinkedList<T>将具有卓越的性能。

这些集合应该是任何 .NET 开发人员(实际上是任何开发人员)工具集的一部分。如果您发现自己在使用项目集合的任何地方都使用List<T>(或ArrayList)或类似的数据结构,那么这很可能会导致性能问题 - 再次强调,尤其是当您的集合很大时。这些并不是我所说的微不足道的性能提升。所以请注意为您的收藏类型做出明智的选择。


但我一般会推荐一个性能分析器,例如ANTS(很好,但不是免费的)或EQATEC(也很好而且免费)。只需在其中一个程序下运行您的应用程序,然后查看您的瓶颈在哪里。我的猜测是你会发现它与你的非通用集合无关。但很自然,我可能是错的。

于 2010-11-11T14:35:49.990 回答
2

为什么不设置一个快速控制台应用程序来测量各种操作的速度。您可以使用这样的简单方法:

private TimeSpan TimedAction(Action action)
{
    var timer = new Stopwatch();

    timer.Start();

    action.Invoke();

    timer.Stop();

    return timer.Elapsed;
}

并这样称呼它:

var elapsed = TimedAction(() =>
    {
        //Do some stuff with your collection here
    });

Console.WriteLine("Elapsed Time: {0}", elapsed.TotalMilliseconds);

您应该能够从中收集足够的经验证据,以确定在类似操作下哪个集合会更快。项目数,执行的连续操作数等...

但是,正如上面提到的;与数据访问和网络延迟并列时,花费在第三方收集上的整体性能可能微不足道。

于 2010-11-11T14:37:01.890 回答
1

这是您需要的证明。

来自MSDN

除了类型安全之外,泛型集合类型通常在存储和操作值类型方面表现更好,因为不需要对值类型进行装箱。

请注意,在现实生活中,仿制药实际上并没有微软所说的那么快。差异可以忽略不计。

于 2010-11-11T14:45:19.750 回答
1

@Dan Tao 说的是钱。

在类似的情况下,我发现自己经常做的是这种技术,您可以在任何 IDE 下进行。

所以我知道你想测量一个特定的东西,但总的来说,你最关心的是发现性能问题,无论它们在哪里,对吧?

我们就此类问题进行了辩论,但该计划真正花费时间的内容与此无关。诸如深入地下图书馆 30 层之类的事情,只是为了执行诸如从资源中提取字符串之类的事情,以便可以将它们翻译成不同的语言,而实际上不需要这样做。诸如某人将属性设置为 True 之类的事情,这会引发一系列通知,其中包括在列表中添加或删除内容、更新树视图控件、创建和销毁窗口、添加/删除选项卡和菜单项等。然后过了一会儿,该属性再次设置为 False,好像没什么大不了的。诸如在网格控件中设置单元格之类的事情,随之而来的是类似的潮汐波。一般来说,尾巴摇摆的狗。

这就是我所说的真正发生的事情。当拳击之类的事情成为问题时,样本会显示出来。

于 2010-11-12T15:32:29.553 回答