当前位置: 首页 > news >正文

用Stopwatch类来测试你的程序运行时间

上个月在项目中,由于我做的网页后台计算步骤多,运行时间长,成了棘手问题,如此一来就要优化性能,找出瓶颈,重构代码

同事当时的建议是使用时间戳(timespan),后来一个同事用的是诊断模式里面一个计时方法,现在看来都很别扭,因为要

把时间减来减去,感觉不方便,不好用.今天我偶然的发现了stopwatch这个宝贝,不错,这个类是在.net 2.0的时候才加入的

看来微软想的挺周到,这个类就是专门为了对付这种情况来使用的工具,并且它还有一个非常不错的功能,可以重新归零再计时

.下面是转载的内容.

软件的运行速度必须要在用户可以接受的范围内。通常,改善那些短暂的但频繁使用的例程的速度会大幅度地提高软件的整体速度。
要改善速度,当然首先要能够量度时间。好,那我们考虑一下在跑道上的情况,枪声一响,马上按下秒表开始计时,在选手到达终点那一刻结束计时,这时就可以知 道该选手所用的时间了。要开始对下一轮比赛计时前,要先将秒表归零。.NET2.0也提供了这样一个秒表:Stopwatch类,它可以比较精确地测量时 间。
速度测试:
软件的性能和可测性是一个复杂的主题。要确保应用程序能够满足用户的期望,就需要在开发周期内考虑它的性能和可测性。这在设计阶段至关重要,一个糟糕的设 计几乎肯定会导致糟糕的用户体验。然而,仅仅有好的设计也不能保证程序能够高效地运行,最终代码的质量同样重要。
量度一个运行时间较长的例程相当简单。如果一个过程会持续几分钟,只要一块腕表就可以记录它的时间了。比如一个执行时间为两分钟的过程,10%的改善能够节省12秒,这是很容易去确定的。
而如果要测量一个非常短暂的过程,就要考虑更好的精确性了。比如有一些很小的例程,它们的运行时间可能只有千分之一秒,但会被调用100万次,这样的累积 效果就明显了。在.NET framework的先前版本中,需要使用Windows API函数,而在.NET framework 2.0中,微软引入了Stopwatch(它就是我们的秒表)类来简化时间的量度任务。
Stopwatch类:
使用Stopwatch类来量度时间非常简单。跟现实生活中的秒表一样,这个类的对象也能够对计数器进行开始、停止、归零(重置)操作,不过它可比一般的秒表精确多了,它能够精确到微秒(也就是百万分之一秒)。
示例代码:
要演示Stopwatch的使用还是来段代码吧。下面是一个控制台应用程序,它将1到100万之间的所有整数累加:


using System;

namespace StopWatchClass
{
class Program
{
static void Main(string[] args)
{
long total = 0;

for (int i = 1; i <= 10000000; i++)
{
total += i;
}
}
}
}
添加Stopwatch对象:
Stopwatch类位于System.Diagnostics命名空间。下面是添加对象后的代码:
using System;
using System.Diagnostics;

namespace StopWatchClass
{
class Program
{
static void Main(string[] args)
{
Stopwatch timer = new Stopwatch();
long total = 0;

for (int i = 1; i <= 10000000; i++)
{
total += i;
}
}
}
}
控制Stopwatch对象:
Stopwatch提供了几个方法用以控制Stopwatch对象。Start方法开始一个计时操作,Stop方法停止计时。此时如果第二次使用 Start方法,将继续计时,最终的计时结果为两次计时的累加。为避免这种情况,在第二次计时前用Reset方法将对象归零。这三个方法都不需要参数。代 码是:
using System;
using System.Diagnostics;

namespace StopWatchClass
{
class Program
{
static void Main(string[] args)
{
Stopwatch timer = new Stopwatch();
long total = 0;

timer.Start();
for (int i = 1; i <= 10000000; i++)
{
total += i;
}

timer.Stop();
}
}
}
读取Stopwatch结果:
<!--[if !supportLists]--><!--[endif]--> 在结束计时后下一步就是读取计时结果了。Stopwatch类提供了一下属性:
<!--[if !supportLists]--><!--[endif]--><!--[if !supportLists]--><!--[endif]-->
Elapsed:返回一个TimeSpan对象,表示计时时间间隔;
ElapsedMilliseconds:返回计时经过的微秒数,精确度稍差,适合于稍长一点的计时;
ElapsedTicks: 返回计时经过的计时器刻度(timer tick)数。计时器刻度是Stopwatch对象可能的最小量度单位。计时器刻度时间的长度由特定的计算机和操作系统确定。Stopwatch对象的 Frequency静态字段的值表示一秒所包含的计时器刻度数。注意它与TimeSpan的Ticks属性所用的时间单位的区别。
应当根据计时任务的情况选择其中的一个属性。在我们的示例程序中,Elapsed属性提供了需要的精确度,用它来输出经过的微秒数。这也是TimeSpan的最高精确度了。
下面是最终的程序代码:


using System;
using System.Diagnostics;

namespace StopWatchClass
{
class Program
{
static void Main(string[] args)
{
Stopwatch timer = new Stopwatch();
long total = 0;

timer.Start();
for (int i = 1; i <= 10000000; i++)
{
total += i;
}

timer.Stop();

decimal micro = timer.Elapsed.Ticks / 10m;
Console.WriteLine("Execution time was {0:F1} microseconds.", micro);
}
}
}
另外,使用IsRunning属性可以查看一个Stopwatch实例是否正在计时,使用StartNew方法可以开始一个新的计时器。

相关文章:

  • UVA1613 K-Graph Oddity(无向图染色简单题)
  • 属于我们的移动智能时代
  • UVA1614 Hell on the Markets(结论+贪心)
  • OPhone开发环境设置备忘录
  • 尺有所长,寸有所短——谁是主人
  • Codeforces Round #636 (Div. 3) E. Weights Distributing(bfs求无向无权图最短路径)
  • 另一种MTK特效制作的方法,层复制
  • 字典树(Trie)——入门篇
  • 警惕:电信加紧发力为哪般?(下)
  • Codeforces Round #637 (Div. 2) C. Nastya and Strange Generator(阅读理解/思维)
  • Broken Space Bar(Trie)[待补]
  • 小白兔和小灰兔
  • VC图片显示特效
  • UVA1153 Keep the Customer Satisfied(贪心+优先队列)
  • UVA10570 Meeting with Aliens(枚举/优化)
  • Computed property XXX was assigned to but it has no setter
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Java精华积累:初学者都应该搞懂的问题
  • nodejs:开发并发布一个nodejs包
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • unity如何实现一个固定宽度的orthagraphic相机
  • vue--为什么data属性必须是一个函数
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 仿天猫超市收藏抛物线动画工具库
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 构建工具 - 收藏集 - 掘金
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 聚类分析——Kmeans
  • 前端工程化(Gulp、Webpack)-webpack
  • 如何解决微信端直接跳WAP端
  • 使用Gradle第一次构建Java程序
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 我看到的前端
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ###C语言程序设计-----C语言学习(3)#
  • #、%和$符号在OGNL表达式中经常出现
  • $ git push -u origin master 推送到远程库出错
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (二)换源+apt-get基础配置+搜狗拼音
  • (翻译)terry crowley: 写给程序员
  • (十三)Flask之特殊装饰器详解
  • (四)JPA - JQPL 实现增删改查
  • (一) springboot详细介绍
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .Net 8.0 新的变化
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇