代码之家  ›  专栏  ›  技术社区  ›  AJ.

有没有方法来衡量拳击/取消拳击的处罚?

  •  4
  • AJ.  · 技术社区  · 14 年前

    我正在使用一个框架,它使用从 System.Collections.CollectionBase . 用户一直在抱怨性能问题,我觉得这些集合使用得非常频繁,可能是问题的主要部分。有没有工具或分析器或在IL,我可以得到一些拳击/取消拳击惩罚指标?我需要证据来支持 System.Collections.Generic 相反。我试过CLRProfiler,但往往会迷路,不确定我应该找什么。


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

    4 回复  |  直到 14 年前
        1
  •  10
  •   Dan Tao    14 年前

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

    换一种说法:很值得怀疑的是 拳击 用户 会注意到的。

    很明显,我是泛泛而谈。如果不知道你的具体情况,我真的不能肯定地说那么多。


    :请注意,虽然我怀疑您的问题可能是您使用 非泛型集合 非常重要的是 类型 用于解决给定问题的集合,尤其是集合中的数据量很大时。下面是几个例子:

    • Dictionary<TKey, TValue> 明显地 List<T> ,例如。
    • HashSet<T> 会有更好的表现。
    • 如果你在找 FIFO Queue<T> 会有更好的表现。
    • 如果在集合中的任意位置执行插入/移除,则 LinkedList<T>

    这些集合应该是任何.NET开发人员(实际上,任何开发人员)工具集的一部分。如果你发现自己在使用 列表<T> (或 ArrayList 可以 在未来会引起性能问题——同样,特别是当您的集合很大时。这些并不是我所说的微不足道的性能提升。所以一定要为你的收藏做出明智的选择


    但我推荐一个性能分析器,比如 ANTS EQATEC (也很好

        2
  •  2
  •   Community CDub    8 年前

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

    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);
    

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

    ,作为 Dan

        3
  •  1
  •   Community CDub    8 年前

    @陶丹的话是对的。

    this technique ,在任何IDE下都可以执行此操作。

    所以我知道你想衡量一件特定的事情,但总的来说,你最关心的是在任何地方发现性能问题,对吧?

    我们有关于这些问题的辩论,但是计划是什么 花时间在这上面与此无关。比如深入地下库30层,只需要从资源中提取字符串,这样就可以将它们翻译成不同的语言,而实际上,它们不需要这样做。像somebody这样的设置将属性设置为True,这将触发一系列通知,包括从列表中添加或删除的内容、更新树状视图控件、创建和销毁窗口、添加/删除选项卡和菜单项等。不久之后,该属性再次设置为False,好像没什么大不了的。比如在网格控件中设置单元格,在网格控件中会出现类似的分支浪潮。

    这就是我的意思

        4
  •  1
  •   Joebone Liviu M.    13 年前

    这是你需要的证据。

    MSDN :

    除了类型安全,通用 更便于存储和操作 值类型,因为不需要

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