有没有办法测量装箱/拆箱的罚款?

AJ.*_*AJ. 4 .net performance profiling boxing

我正在使用一个使用派生自的集合的框架System.Collections.CollectionBase.用户一直在抱怨性能,我觉得这些使用频繁的集合可能是问题的重要组成部分.有没有办法使用工具或探查器或在IL中我可以得到一些关于装箱/拆箱处罚的指标?我需要证据支持推动System.Collections.Generic.我已经尝试过CLRProfiler,但往往会迷路而且不确定我应该寻找什么.

更新
到目前为止感谢您的所有意见.我知道这可能不是主要的瓶颈,但我正在寻找尽可能多的性能杀手的指标.这只是其中之一,不确定它有多大,因此寻找一种衡量它的方法.

Dan*_*Tao 10

虽然我当然鼓励你从非通用集合转移到通用集合,但有充分的理由,我真的怀疑这些集合可能是导致性能问题的原因.当你达到微观水平时,拳击通常只是一个问题,需要在高性能情况下挤出微小的收益.一般来说,出于GC的原因,也可以避免这种情况,但在这个领域它通常也很小.

换句话说:拳击会导致用户注意到的性能问题,这是非常值得怀疑的.

显然,我是在概括地说.在不了解您的具体情况的情况下,我无法确切地说出这么多.


编辑:请注意,虽然我怀疑你的问题可能是你使用非泛型集合本身,但我会指出你用什么类型的集合来解决给定的问题非常重要的,特别是当数据量大时这个系列很大.以下是几个例子:

  • 例如,如果您正在基于密钥执行查找,则哈希表Dictionary<TKey, TValue>明显优于a List<T>.
  • 如果您正在检查重复项,那么HashSet<T>将具有卓越的性能.
  • 如果您正在寻找FIFO(类似队列)行为,那么Queue<T>将具有卓越的性能.
  • 如果您在集合中的随机位置执行插入/删除,LinkedList<T>则具有卓越的性能.

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


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