测试代码的速度?
Posted
技术标签:
【中文标题】测试代码的速度?【英文标题】:Testing your code for speed? 【发布时间】:2008-09-22 21:50:04 【问题描述】:我是一个完全的新手,但我正在编写一个在 C# 中处理字符串的小程序,我注意到如果我做一些不同的事情,代码的执行速度会大大加快。
所以我想知道,您如何为代码的执行速度计时?是否有任何(免费)实用程序?您是否使用 System.Timer 以老式方式执行此操作并自己进行操作?
【问题讨论】:
【参考方案1】:您所描述的内容称为性能分析。您可以使用许多程序来执行此操作,例如 Jetbrains profiler 或 Ants profiler,尽管大多数程序会在测量其性能的过程中减慢您的应用程序的速度。
要手动滚动您自己的性能分析,您可以使用 System.Diagnostics.Stopwatch 和一个简单的 Console.WriteLine,就像您描述的那样。
另外请记住,C# JIT 编译器会根据调用的类型和频率来优化代码,因此请尝试使用不同大小的循环和方法(例如递归调用)来了解最有效的方法。
【讨论】:
+1:秒表是一个方便的小工具,可以快速检查 - 谢谢!【参考方案2】:ANTS Profiler from RedGate 是一个非常好的性能分析器。 dotTrace Profiler from JetBrains 也很棒。这些工具可让您查看可深入到每一行的性能指标。
ANTS Profiler 的屏幕截图: ANTS http://www.red-gate.com/products/ants_profiler/images/app/timeline_calltree3.gif
如果要确保在单元测试期间特定方法保持在特定性能阈值内,我会使用Stopwatch
class 在循环中多次监视方法的执行时间并计算平均值,然后Assert
反对结果。
【讨论】:
我们使用这个。找到一个需要 95% 时间的例程非常有效!【参考方案3】:提醒一下 - 确保在 Relase 中编译,而不是在 Debug 中编译! (我见过经验丰富的开发人员犯的这个错误——很容易忘记)。
【讨论】:
我有点不同。为了找到加速,最好在调试模式下工作。全部完成后,切换到释放模式。原因是 - 如果代码正在做一些愚蠢的事情,例如调用某些必要的函数,或者分配/释放更多需要的内存,或者执行您没有意识到的 I/O,释放模式将无法修复它。它只会让人很难找到。【参考方案4】:您所描述的是“性能调整”。当我们谈论性能调整时,有两个角度。 (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 取消负载= 15 * .01= 0.15 在这里调整预订将对吞吐量产生最大的影响。 您还可以通过重复进行线程转储(在基于 Java 的应用程序的情况下)来识别吞吐量的热点。
【讨论】:
【参考方案5】:使用分析器。
蚂蚁 (http://www.red-gate.com/Products/ants_profiler/index.htm) dotTrace (http://www.jetbrains.com/profiler/)如果您只需要为一种特定方法计时,Stopwatch 类可能是一个不错的选择。
【讨论】:
【参考方案6】:我做以下事情: 1)我使用刻度(例如在 VB.Net Now.ticks 中)来测量当前时间。我从完成的刻度值中减去起始刻度,然后除以 TimeSpan.TicksPerSecond 以获得它花费了多少秒。 2) 我避免 UI 操作(如 console.writeline)。 3) 我在一个实质性的循环(如 100,000 次迭代)上运行代码,以尽可能地排除使用/操作系统变量。
【讨论】:
【参考方案7】:您可以使用 StopWatch 类对方法进行计时。请记住,由于必须对代码进行 jit,第一次通常很慢。
【讨论】:
【参考方案8】:有一个本机 .NET 选项(软件开发人员的团队版)可以满足一些性能分析需求。从 2005 .NET IDE 菜单中,选择工具->性能工具->性能向导...
[GSS 可能是正确的,你必须有团队版]
【讨论】:
【参考方案9】:这是测试代码速度的简单示例。希望对你有帮助
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);
【讨论】:
以上是关于测试代码的速度?的主要内容,如果未能解决你的问题,请参考以下文章