在Windows系统中,评估程序性能的最佳方法是什么?

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

在Windows XP中是否有任何好的系统设施可以用于此,或者我只需使用System.Diagnostics.Stopwatch [edit]并编写文本日志以供手动解释,还是有其他方法?

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


为了让其他人受益于更多的答案,我认为最好重新打开这个问题。 - Michael Ratanapintha
啊,又一次并行教训失败了... - Michael Ratanapintha
@Michael Ratanapintha: 能详细解释一下吗? - Ben Collins
当我开始写我的第一条评论时,这个问题仍然被关闭,但当我发布它时,你已经重新打开了它。 - Michael Ratanapintha
哦,好的。我只是关闭它,这样我就可以快速编辑以防止出现“使用Stopwatch!”的评论洪水。我已经知道了Stopwatch。 - Ben Collins
6个回答

8
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 编译过程可能会导致第一次运行结果非常偏斜,因此您还应该将首次运行与平均结果分开。 - Ed S.
艾德·S:这是个好观点,但并不一定如此。如果代码实际上只运行一次,那么 JIT 时间可能需要纳入考虑。 - Mitch Wheat
1
当然,我的意思不是完全忽略那些信息,而是要确保将其隔离开来,以避免提高平均值。只要测试人员意识到这一点,就应该没问题。我正在调整一个可以在一些相当大的数据块上调用的XML解析例程(相对于我的应用程序而言),第一次调用需要约931毫秒,而所有后续调用则需要约91毫秒。 - Ed S.
一个刻度对应什么? - Harshit Jain

5

对于微基准测试,我非常喜欢MeasureIt(可以从http://msdn.microsoft.com/en-us/magazine/cc500596.aspx下载)。这是由CLR上的性能架构师Vance Morrison编写的测试项目。它目前具有许多.Net/CLR核心方法的良好基准测试。最好的部分是它很容易进行调整并添加新的基准测试,以便您想要测试的任何内容。只需运行“MeasureIt /edit”,它将启动VS并为其自身提供项目,以便您可以查看如何编写这些基准测试并按类似方式添加新的基准测试。

如已经说明的那样,StopWatch可能是最简单的方法,并且MeasureIt在计时方面使用了StopWatch,但它还做了其他一些事情,例如运行一段代码X次,然后为运行提供统计信息等。


4
这里有很多性能分析工具可供使用,以下是我所知道的一些: 如果您继续使用System.Diagnostics.Stopwatch,您只能在代码的特定点中明确放置Start/Stop来进行测试。这对于测量特定部分(如紧密循环或类似内容)已足够,但无法为您提供程序花费大部分时间的完整图片。

4

如果您只需要一些快速的数字,可以使用Powershell来计时整个执行过程。使用measure-command cmdlet。它大致相当于Unix中的"time"。

> 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

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

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接