测试代码的速度?
我是一个新手,但是我在Cand中编写了一个处理字符串的小程序,我注意到如果我做一些不同的事情,则代码的执行速度将大大提高。
因此,我想知道,如何提高代码的执行速度?有(免费)实用程序吗?我们是否使用System.Timer以老式方式处理它并自己完成?
解决方案
使用探查器。
- 蚂蚁(http://www.red-gate.com/Products/ants_profiler/index.htm)
- dotTrace(http://www.jetbrains.com/profiler/)
如果只需要计时一种特定的方法,那么Stopwatch类可能是一个不错的选择。
我做以下事情:
1)我使用刻度(例如VB.Net Now.ticks中的刻度)来测量当前时间。我从完成的刻度值中减去开始的刻度,然后除以TimeSpan.TicksPerSecond,以获取花费的秒数。
2)我避免进行UI操作(例如console.writeline)。
3)我在一个实质性的循环(例如100,000次迭代)上运行代码,以尽最大可能地考虑使用率/操作系统变量。
RedGate的ANTS Profiler是一个非常不错的性能分析器。 JetBrains的dotTrace Profiler也很棒。这些工具可让我们查看可逐条细化的性能指标。
Scree拍摄的ANTS Profiler:
蚂蚁http://www.red-gate.com/products/ants_profiler/images/app/timeline_calltree3.gif
如果要确保特定方法在单元测试期间保持在特定性能阈值内,我将使用" Stopwatch"类在一个循环中多次监视该方法的执行时间,并计算平均值,然后"确定"反对结果。
我们可以使用StopWatch类对方法进行计时。请记住,由于必须添加代码,第一次通常很慢。
我们所描述的称为性能分析。我们可以使用许多程序来执行此操作,例如Jetbrains探查器或者Ants探查器,尽管大多数程序在评估其性能的过程中会使应用程序变慢。
要手动滚动自己的性能分析,可以使用System.Diagnostics.Stopwatch和简单的Console.WriteLine,如我们所述。
还请记住,CJIT编译器会根据调用的类型和频率来优化代码,因此请尝试使用大小不同的循环以及诸如递归调用之类的方法,以最佳地体验一下。
提醒我们,请务必在Relase中进行编译,而不要在Debug中进行编译! (我已经看到了经验丰富的开发人员犯的这个错误,很容易忘记)。
我们所描述的是"性能调整"。当我们谈论性能调优时,有两个角度。 (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的应用程序)来确定吞吐量的热点。
有一个本机.NET选项(软件开发人员团队版)可以解决一些性能分析需求。从2005 .NET IDE菜单中,选择"工具"->"性能工具"->"性能向导" ...
段落数量不匹配