2008-09-22 194 views
7

我是一个总新手,但我正在编写一个在C#中处理字符串的小程序,我注意到如果我以不同的方式做了一些事情,代码执行速度明显加快。测试你的代码速度?

所以它让我想知道,你如何去计算你的代码的执行速度?有没有(免费)公用事业?你有没有用System.Timer老式的做法,自己做?

回答

12

您所描述的内容称为性能分析。有很多程序可以执行此操作,例如Jetbrains profilerAnts profiler,但大多数程序会在您测量性能的过程中减慢应用程序的速度。

要手动进行自己的性能分析,可以使用System.Diagnostics.Stopwatch和简单的Console.WriteLine,就像您所描述的一样。还请记住,C#JIT编译器会根据所调用的类型和频率优化代码,因此请仔细研究不同大小和循环的方法(例如递归调用),以获得最佳效果。

+0

+1:该秒表是快速检查的便利小工具 - 谢谢! – 2009-05-29 10:55:57

0

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

11

ANTS Profiler from RedGate是一个非常不错的性能分析器。 dotTrace Profiler from JetBrains也很棒。这些工具将允许您查看可以在每条生产线上钻取的性能指标。

蚂蚁探查的卵石射击: ANTS http://www.red-gate.com/products/ants_profiler/images/app/timeline_calltree3.gif

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

+0

我们用这个。 95%的时间找到一个程序非常有效! – 2009-06-01 05:25:42

0

您可以使用StopWatch类来计时方法。记住,第一次通常是由于代码必须被打乱而变慢。

7

只是提醒 - 确保在Relase中编译,而不是调试! (我见过经验丰富的开发人员犯了这个错误 - 很容易忘记)。

+0

我有点不同。为了加速,最好在调试模式下工作。全部完成后,切换到释放模式。原因是 - 如果代码做的事情很愚蠢,比如调用某些必要的函数,或者分配/释放更多需要的内存,或者做了你没有意识到的I/O,释放模式将无法修复它。它只会使它很难找到。 – 2015-07-27 16:13:29

2

你在描述什么是'性能调整'。当我们谈论性能调优时,有两个角度。 (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的应用程序)来确定吞吐量的热点。

0

本地.NET选项(适用于软件开发人员的Team Edition)可能会解决一些性能分析需求。从2005年的.NET IDE菜单中,选择工具 - >性能工具 - >性能向导......

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

0

这对于测试代码的运行速度简单的例子。我希望我帮你

class Program { 
    static void Main(string[] args) { 
     const int steps = 10000; 
     Stopwatch sw = new Stopwatch(); 

     ArrayList list1 = new ArrayList(); 
     sw.Start(); 
     for(int i = 0; i < steps; i++) { 
      list1.Add(i); 
     } 
     sw.Stop(); 
     Console.WriteLine("ArrayList:\tMilliseconds = {0},\tTicks = {1}", sw.ElapsedMilliseconds, sw.ElapsedTicks); 

     MyList list2 = new MyList(); 
     sw.Start(); 
     for(int i = 0; i < steps; i++) { 
      list2.Add(i); 
     } 
     sw.Stop(); 
     Console.WriteLine("MyList: \tMilliseconds = {0},\tTicks = {1}", sw.ElapsedMilliseconds, sw.ElapsedTicks);