【问题标题】:What's the best way to benchmark programs in Windows?在 Windows 中对程序进行基准测试的最佳方法是什么?
【发布时间】:2010-09-13 19:00:33
【问题描述】:

我需要对 Windows 中的 .NET 程序 (C#) 进行一些性能基准测试,但在 Windows 世界中我还没有做太多的基准测试。我已经研究过为此使用带有自定义计数器的 Windows 2000/XP 性能监视器,但我认为这不是我想要的。

在 Windows XP 中是否有任何好的系统工具,或者我只需要使用 System.Diagnostics.Stopwatch [编辑] 并编写文本日志以供手动解释,还是有其他的东西?

编辑:除了System.Diagnostics.Stopwatch还有什么?

【问题讨论】:

  • 为了让其他人可以从其他答案中受益,我认为您最好重新提出问题。
  • 哎呀,并行性的另一个教训出错了......
  • @Michael Ratanapintha:需要详细说明吗?
  • 当我开始写我的第一条评论时,问题仍然关闭,但当我发布它时,你已经重新打开它。
  • 哦,好的。我刚刚关闭它,这样我就可以快速编辑以防止“使用秒表!”的泛滥。厘米。我已经知道秒表了。

标签: c# .net windows performance benchmarking


【解决方案1】:
using System.Diagnostics;
....

Stopwatch sw = new Stopwatch();

sw.Start();

// Code you want to time...

// Note: for averaged accuracy (without other OS effects), 
//       run timed code multiple times in a loop 
//       and then divide by the number of runs.

sw.Stop();

Console.WriteLine("Took " + sw.ElapsedTicks + " Ticks");

【讨论】:

  • 您还应该将第一次运行与平均结果分开,因为它可能由于 JIT 编译过程而高度偏斜。
  • 编辑。 S:好点,但不一定。如果代码实际上只运行一次,那么可能需要考虑 JIT 时间。
  • 当然,我并不是要完全忽略这些信息,只是为了确保将其隔离开来,以免提高平均值。只要做测试的人知道这个事实就应该没问题。我正在调整一个 XML 解析例程,该例程可以在一些相当大的数据块上调用(相对于我的应用程序中的典型情况),第一次传递大约需要 931 毫秒,而所有后续调用需要大约 91 毫秒。
  • 一个勾对应什么?
【解决方案2】:

对于微基准测试,我非常喜欢 MeasureIt(可以从 http://msdn.microsoft.com/en-us/magazine/cc500596.aspx 下载)。这是一个测试项目,由 CLR 的性能架构师 Vance Morrison 编写。它目前为许多 .Net/CLR 核心方法提供了一套很好的基准。它最好的部分是,为你想测试的任何东西调整和添加新的基准是微不足道的。只需运行“MeasureIt /edit”,它就会自动启动带有项目的 VS,这样您就可以查看这些基准是如何编写的,并根据需要以类似的方式添加新的。

如前所述,StopWatch 可能是最简单的方法,MeasureIt 在下面使用 StopWatch 进行计时,但它还执行其他一些操作,例如运行代码块 X 次,然后为您提供运行的统计信息以及其他.

【讨论】:

    【解决方案3】:

    如果您只需要一些快速的数字,您可以使用 Powershell 来计算整体执行时间。使用测量命令 cmdlet。它大致相当于 Unix 中的“时间”。

    > measure-command { your.exe arg1 }
    
    Days              : 0
    Hours             : 0
    Minutes           : 0
    Seconds           : 4
    Milliseconds      : 996
    Ticks             : 49963029
    TotalDays         : 5.78275798611111E-05
    TotalHours        : 0.00138786191666667
    TotalMinutes      : 0.083271715
    TotalSeconds      : 4.9963029
    TotalMilliseconds : 4996.3029
    

    【讨论】:

      【解决方案4】:

      那里有很多分析器。以下是我所知道的一些:

      如果您继续使用 System.Diagnostics.Stopwatch,您将能够仅检测和测量代码的特定点,在这些点您明确放置了 Start/Stop。这对于测量特定部分(例如紧密循环或类似情况)已经足够了,但它无法让您全面了解您的程序大部分时间都花在了哪里。

      【讨论】:

        【解决方案5】:

        这可能不是您想要的,但dotTrace 提供了许多有用的诊断信息,并且已集成到 Visual Studio 中。

        【讨论】:

          【解决方案6】:

          如果您的项目很大,并且有很多模块进行大量调用,您可以: http://www.moduleanalyzer.com/

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-01-20
            • 2011-10-19
            • 1970-01-01
            • 1970-01-01
            • 2019-08-17
            • 1970-01-01
            相关资源
            最近更新 更多