测试代码的速度?

时间:2008-09-22 21:50:05

标签: c# performance profiling timing

我是一个新手,但我正在编写一个在C#中处理字符串的小程序,我注意到如果我做了一些不同的事情,代码执行得更快。

所以我想知道,你如何计算代码的执行速度?有没有(免费)公用事业?你是否采用System.Timer的老式方式自行完成它?

9 个答案:

答案 0 :(得分:14)

您所描述的内容称为性能分析。您可以使用许多程序执行此操作,例如Jetbrains profilerAnts profiler,但大多数程序会在衡量其效果的过程中减慢您的应用程序。

要手动滚动您自己的性能分析,您可以使用System.Diagnostics.Stopwatch和一个简单的Console.WriteLine,就像您所描述的那样。

另外请记住,C#JIT编译器根据调用的类型和频率优化代码,因此请使用不同大小和方法的循环,例如递归调用,以了解哪种方法效果最佳。

答案 1 :(得分:11)

ANTS Profiler from RedGate是一个非常好的性能分析器。 dotTrace Profiler from JetBrains也很棒。通过这些工具,您可以查看可以在每条线上钻取的性能指标。

ANTS Profiler的Scree镜头: ANTS http://www.red-gate.com/products/ants_profiler/images/app/timeline_calltree3.gif

如果你想确保特定方法在单元测试期间保持在特定的性能阈值内,我会使用Stopwatch class在循环中多次监视方法的执行时间并计算平均值然后Assert反对结果。

答案 2 :(得分:7)

只是提醒一下 - 确保在Release中编译,而不是Debug! (我看到经验丰富的开发人员犯了这个错误 - 很容易忘记)。

答案 3 :(得分:3)

你在描述什么是'性能调整'。当我们谈论性能调优时,它有两个角度。 (a)响应时间 - 执行特定请求/程序所需的时间。 (b)吞吐量 - 一秒钟内可以执行多少个请求。当我们通常“优化”时 - 当我们消除不必要的处理时,响应时间和吞吐量都会提高。但是,如果您的代码中有等待事件(如Thread.sleep(),I / O等等),则响应时间会受到影响,但吞吐量不会受到影响。通过采用并行处理(产生多个线程),我们可以缩短响应时间,但不会提高吞吐量。通常,对于服务器端应用程序,响应时间和吞吐量都很重要对于桌面应用程序(如IDE),吞吐量并不重要,只有响应时间很重要。

您可以通过“效果测试”来衡量响应时间 - 您只需记下所有关键交易的响应时间。您可以通过“负载测试”来测量吞吐量 - 您需要从足够多的线程/客户端连续地抽取请求,以便服务器计算机的CPU使用率为80-90%。当我们提出请求时,我们需要保持不同交易之间的比率(称为交易组合) - 例如:在预订系统中,每100次搜索将有10次预订。每10次预订会有一次取消等。

在确定需要调整响应时间(性能测试)的事务后,您可以使用分析器识别热点。 您可以通过比较该事务的响应时间*分数来确定吞吐量的热点。假设在搜索,预订,取消方案中,比例为89:10:1。 响应时间为0.1秒,10秒和15秒。 加载搜索 - 0.1 * .89 = 0.089 预订负载 - 10 * .1 = 1 对于Cancell = 15 * .01 = 0.15的加载 调整预订将对吞吐量产生最大影响。 您还可以通过重复进行线程转储(在基于Java的应用程序的情况下)来识别吞吐量的热点。

答案 4 :(得分:1)

使用分析器。

如果您只需要为一个特定方法计时,那么秒表类可能是个不错的选择。

答案 5 :(得分:0)

我做了以下事情: 1)我使用ticks(例如在VB.Net Now.ticks中)来测量当前时间。我从完成的刻度值中减去起始刻度并除以TimeSpan.TicksPerSecond以获得它花了多少秒。 2)我避免UI操作(如console.writeline)。 3)我在一个实质性循环(如100,000次迭代)上运行代码,尽可能地分解使用/操作系统变量。

答案 6 :(得分:0)

您可以使用StopWatch类来计算方法。请记住,由于代码必须被咬合,第一次通常很慢。

答案 7 :(得分:0)

有一个本机.NET选项(面向软件开发人员的Team Edition)可能会满足一些性能分析需求。从2005 .NET IDE菜单中,选择Tools-> Performance Tools-> Performance Wizard ...

[GSS可能是正确的,您必须拥有团队版]

答案 8 :(得分:0)

这是测试代码速度的简单示例。我希望我帮助你

cellForRowAtIndexPath