在Windows中对程序进行基准测试的最佳方法是什么?
我需要在Windows中的.NET程序(C#)上执行一些性能基准测试,但在Windows世界中并没有做太多基准测试。我已经考虑将Windows 2000 / XP Performance Monitor与自定义计数器一起使用,但是我认为这不是我想要的。
在Windows XP中是否有用于此目的的良好系统设施,还是仅需要使用System.Diagnostics.Stopwatch [edit]并编写文本日志以进行手动解释,或者还有其他功能吗?
编辑:除了System.Diagnostics.Stopwatch
还有什么?
解决方案
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");
这可能不是我们想要的,但是dotTrace提供了许多有用的诊断程序,并已集成到Visual Studio中。
那里有很多探查器。这是我所知道的一些:
- 红门的蚂蚁
- Yourkit的.Net Profiler
- JetBrains dotTrace
如果继续使用System.Diagnostics.Stopwatch,我们将只能检测和测量代码的特定点,在这些点上明确放置"开始/停止"。这对于测量特定部分(例如紧密循环或者类似的东西)已经足够好了,但是它并不能为我们提供程序大部分时间花在哪里的完整图片。
对于微基准测试,我真的很喜欢MeasureIt(可以从http://msdn.microsoft.com/zh-cn/magazine/cc500596.aspx下载)。这是CLR的性能架构师Vance Morrison编写的测试项目。目前,它为许多.Net / CLR核心方法提供了一套不错的基准。最好的部分是,微调并为我们要测试的任何内容添加新的基准。只需运行" MeasureIt / edit",它就会为项目本身启动VS,以便我们可以查看这些基准的编写方式,并且可以根据需要以类似的方式添加新基准。
如前所述,StopWatch可能是执行此操作的最简单方法,而MeasureIt在其定时下使用StopWatch,但它还执行其他一些操作,例如将代码块运行X次,然后为运行提供统计信息,而不是提供统计信息。
如果只需要一些快速数字,则可以使用Powershell来计时整体执行时间。使用measure-command 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
如果项目很大,并且有许多模块可以进行大量调用,那么我们可以:
http://www.moduleanalyzer.com/