【问题标题】:C# How can I determine where the slow parts of my code are?C# 如何确定我的代码的慢速部分在哪里?
【发布时间】:2010-10-03 21:54:45
【问题描述】:

我的编码时间不长,所以我不熟悉哪种技术最快,所以我想知道是否有办法在 VS 中或使用 3rd 方工具来做到这一点?

谢谢

【问题讨论】:

  • 您是否已经确定您的代码确实很慢?

标签: c# profiling performance


【解决方案1】:

好的,投反对票时间...

分析器非常适合测量。

但您的问题是“我如何确定我的代码的慢速部分在哪里?”。

这是一个不同的问题。这是诊断,而不是测量。

我知道这不是一个流行的观点,但这是真的。

这就像一个试图削减成本的企业。

一种方法(自上而下)是衡量整体财务状况,然后按类别和部门进行细分,并尝试猜测可以消除哪些因素。 那是测量。

另一种方法(自下而上)是随机走进办公室,随机挑选某人,并详细询问他们当时在做什么以及(重要的是)为什么。

多次这样做。

这就是哈里·杜鲁门 (Harry Truman) 在二战爆发时在美国国防工业中所做的事情,并通过访问多个站点立即发现了大规模的欺诈和浪费。 那是诊断。

在代码中,您可以通过一种非常简单的方式做到这一点:“暂停”它并询问它为什么要花费那个特定的周期。通常调用堆栈会详细说明原因。

多次这样做。

这是采样。一些分析器对调用堆栈进行采样。但是出于某种原因,他们坚持总结每个功能所花费的时间,包括包容性和排他性。这就像在业务中按部门进行总结,包容性和排他性。

它会丢失您需要的信息,即说明是否需要循环的细粒度信息。

回答您的问题:

只需暂停您的程序几次,每次都捕获调用堆栈。如果您的代码非常慢,那么浪费的函数调用将出现在几乎每个堆栈上。他们会精确地指出“你的代码的缓慢部分”。

添加:RedGate ANTS 即将到来。它可以为您逐行提供成本,而且非常漂亮。因此,如果您使用 .NET,并且可以节省 3 个数字,并且不介意等待安装和学习它,它可以告诉您 Pause 键可以告诉您的大部分内容,并且更漂亮。

【讨论】:

  • 我完全同意这个 Mike。我建议您编辑此内容,然后发布“回答您的问题”部分。
  • @Mo:谢谢 - 我会考虑的。只是我很沮丧,整个行业对这个特定问题如此盲目,而在其他事情上却如此聪明。
  • 这也可以用于分析 Web 应用程序吗?它们不会持续使用 CPU,仅在 Web 请求时使用,这使得暂停它们很困难。
  • @MartinStaufcik:我认为是的。我不需要调整任何网络应用程序,但主体应该是相同的,因为它只是 I/O。暂停告诉你为什么要花费 clock 时间,这可能是 I/O 和 CPU 时间一样容易。
【解决方案2】:

分析。

RedGate 有产品。
JetBrains 有产品。

【讨论】:

    【解决方案3】:

    我用过 ANTS Profiler,我可以加入其他人的推荐。

    当您将其与为您节省的开发时间进行比较时,价格可以忽略不计。

    我以开发者为生,你的公司不会给你买,要么换公司,要么给自己买。

    【讨论】:

      【解决方案4】:

      要分析大型复杂的 UI 应用程序,您通常需要一组工具和方法。我将概述我最近在一个项目中使用的方法和工具,以提高 .Net 2.0 UI 应用程序的性能。

      首先,我采访了用户,并亲自研究了用例,列出了目标用例列表,突出了系统性能较差的领域。 IE。我不想花 n 个工作日来优化一个几乎从未使用过但速度很慢的功能。但是,我想花时间优化一个有点慢但每天调用 1000 次的功能,等等。

      一旦确定了候选用例,我就使用自己的轻量级日志记录类来检测我的代码(我使用了一些高性能计时器和自定义日志记录解决方案,因为需要亚毫秒级的精度)。但是,您可能能够摆脱 log4net 和时间戳。我检测代码的原因是有时阅读您自己的日志而不是分析器的输出更容易。出于各种原因,我需要两者(例如,使用分析器测量 .Net 用户控件布局并不总是那么简单)。

      然后我使用 ANTS 分析器运行我的检测代码并分析用例。通过结合 ANTS 配置文件和我自己的日志文件,我能够很快发现我们的应用程序存在的问题。

      我们还对服务器和 UI 进行了概要分析,并能够计算出在 UI 上花费的时间、在网络上花费的时间、在服务器上花费的时间等的细分。

      另外值得注意的是,1 次运行是不够的,第 1 次运行通常值得扔掉。让我解释一下:PC 负载、网络流量、JIT 编译状态等都会影响特定操作所需的时间。一个简单的策略是测量一次操作 n 次(比如 5 次),丢弃最慢和最快的运行,然后分析剩余的配置文件。

      【讨论】:

      • 我觉得你有点太高兴了,不能扔在那里。在考虑扔掉之前,我至少会获得数十个结果。通常,当我进行性能分析时,我会采用 Min / Max / Avg。然后我展示了第一次运行和不运行的结果(以隔离初始化和 JIT)
      【解决方案5】:

      Eqatec profiler 是一个可爱的小型分析器,免费且易于使用。就功能而言,它可能不会接近 Ants profiler 的“哇”因素,但它仍然是非常酷的 IMO,值得一看。

      【讨论】:

        【解决方案6】:

        使用profilerANTS 花钱但很不错。

        【讨论】:

          【解决方案7】:

          我只是设置了断点,视觉会告诉你断点之间已经过去了多少毫秒。所以你可以手动找到它。

          【讨论】:

            【解决方案8】:

            ANTS Profiler很好。

            【讨论】:

              【解决方案9】:

              ANTS Profiler 的Tutorial/Explanation

              【讨论】:

                【解决方案10】:

                如果您不想付费,较新的 VS 版本带有分析器,但老实说,它似乎不太好。 ATI/AMD 制作了一个免费的分析器……但它对用户不太友好(对我来说,我无法从中获得任何有用的信息)。

                我会给出的建议是使用代码自己调用函数的时间。如果它们很快并且您没有高精度计时器,或者由于多种原因(例如,每个 x 调用构建某种缓存),调用速度不同,请尝试将每个调用运行 x10000 次或其他东西,然后除以结果因此。这对于某些代码部分可能并不完美,但如果您无法找到一个好的、免费的第 3 方解决方案,除非您想付费,否则几乎剩下的就是了。

                【讨论】:

                  【解决方案11】:

                  另一个选择是英特尔的VTune

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-08-31
                    • 1970-01-01
                    • 2019-03-03
                    • 2013-08-16
                    • 1970-01-01
                    • 2018-08-30
                    • 1970-01-01
                    相关资源
                    最近更新 更多