测试你的代码速度?

13

我是一个完全的新手,但我在使用C#处理字符串时写了一个小程序,发现如果做一些不同的事情,代码的执行速度会显著提高。

那么,你如何计算代码的执行速度呢?是否有任何(免费)工具可以使用?或者您还是老派的使用System.Timer自己计时?

9个回答

18

您所描述的是性能分析。有许多程序可用于此,例如Jetbrains profilerAnts profiler,尽管大多数在测量性能时会减慢应用程序的速度。

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

还要注意,C# JIT编译器根据调用类型和频率对代码进行优化,因此可以尝试不同大小的循环和方法(如递归调用)来确定最佳方案。


+1:那个秒表是一个方便的小工具,用于快速检查 - 谢谢! - Jon Cage

11

RedGate的ANTS Profiler 是一个非常好的性能分析工具。 JetBrains的dotTrace Profiler 也很棒。这些工具可以让您查看可钻取到每个单独行的性能指标。

ANTS Profiler 的截图:ANTS http://www.red-gate.com/products/ants_profiler/images/app/timeline_calltree3.gif

如果您想要确保特定方法在单元测试期间保持在特定的性能阈值内,我建议使用Stopwatch监视一个方法的执行时间一次或多次循环,并计算平均值,然后使用Assert来检查结果。


我们使用这个工具。它非常有效地找到了那个占用95%时间的例程! - Christian Payne

8

提醒一下 - 确保编译时选择Relase,而不是Debug!(我见过有经验的开发人员犯这个错误 - 很容易忘记)。


我有些不同的看法。为了寻找加速,最好在调试模式下工作。当一切都完成后,再切换到发布模式。原因是如果代码像多余地调用某些函数、分配/释放更多内存或者进行意外的 I/O 操作时,发布模式将无法解决这些问题。它只会让问题变得更难以找到。 - Mike Dunlavey

3
您所描述的是“性能调优”。当我们谈论性能调优时,有两个方面需要考虑。(a)响应时间-执行特定请求/程序所需的时间。(b)吞吐量-每秒可以执行多少个请求。通常情况下,“优化”意味着消除不必要的处理,这将同时改善响应时间和吞吐量。但是,如果您的代码中存在等待事件(如Thread.sleep(),I/O等待等),则会影响响应时间,但不会影响吞吐量。通过采用并行处理(生成多个线程),我们可以改善响应时间,但吞吐量不会得到改善。对于服务器端应用程序,响应时间和吞吐量都很重要。对于桌面应用程序(如IDE),只有响应时间很重要。
您可以通过“性能测试”来测量响应时间-只需记录所有关键事务的响应时间即可。您可以通过“负载测试”来测量吞吐量-您需要从足够数量的线程/客户端连续地发送请求,以使服务器机器的CPU使用率达到80-90%。在我们发送请求时,需要维护不同事务之间的比例(称为事务混合)-例如:在预订系统中,每100次搜索将有10次预订。每预订10次,将有1次取消等。
在确定需要响应时间调优(性能测试)的事务后,可以使用分析器识别热点。您可以通过比较响应时间*该事务的一部分来确定吞吐量的热点。假设在搜索、预订、取消场景中,比例为89:10:1。响应时间为0.1秒、10秒和15秒。搜索负载-0.1 * .89 = 0.089;预订负载-10 * .1 = 1;取消负载-15 * .01 = 0.15。在这种情况下,调整预订将对吞吐量产生最大影响。您还可以通过反复获取线程转储(对于基于Java的应用程序)来确定吞吐量的热点。

1

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);

0

有一个本地的.NET选项(软件开发团队版)可能可以满足一些性能分析需求。从2005 .NET IDE菜单中,选择工具->性能工具->性能向导...

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


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

0

您可以使用StopWatch类来计时方法。请记住,由于代码需要被JIT编译,因此第一次运行通常会比较慢。


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