`
javatoyou
  • 浏览: 1018423 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

用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方法可以开始一个新的计时器。

分享到:
评论

相关推荐

    智能秒表stopwatch plus v1.02汉化版

    秒表为时间测定用工具。 包含 秒表、倒计时。计时精确度达到百分之一秒 * 主要特征: 秒表: - 百分之一秒精确度(1/100 秒) - 达 99 小时的计时 - 999个储存计时(单圈) - 允许 开始/储存/重新计时/停止计时 ...

    fasttime::stopwatch:用于本地运行wasm应用程序的快速无服务器compute @ edge运行时

    快速时间轻量级的Fastly 运行时,用于在本地运行和测试应用程序关于快速允许您在托管边缘服务器上托管的基于WASI的运行时中运行WASM请求处理程序。 fasttime使用在本地HTTP服务器上为您的应用程序提供服务, ...

    C# 控制台应用程序——随机数

    Stopwatch是C#一个类似秒表的东西,用来计算程序的运行时间,注意,必须按照要求,计时器在程序运行时就要开启,在结束时停止并输出结果,不能放置在其他地方。 3)防伪码生成思路 例如,有以下定义: string ...

    pern_stopwatch_app:秒表应用程序,允许基于秒表注册时间。 PERN应用程序+ Docker

    pern_stopwatch_app 秒表应用程序,允许基于秒表注册时间。 PERN应用程序+ Docker 如何运行:git clone / docker-compose up 测试方法:在项目前面的文件夹中:npm测试。 (包括前组件秒表测试)

    并行计算课程设计(报告+代码+可执行文件)

    虽然没有按时完成作业,但这份报告花了我好几天的时间,从开始的搭建并行计算平台到最后的程序运行成功可以说是对我的一个锻炼。每一次的遇到问题与每一次的解决问题都是一个成长。每一次遇到问题和解决问题都是一种...

    gnomock:测试您的代码而不用临时Docker容器编写模拟code仅用几行代码即可设置流行的服务:stopwatch_selector:没有bash,没有yaml,只有代码:laptop_computer:

    Gnomock –没有模拟的测试 :building_construction_selector: 启动整个依赖项堆栈 :wrapped_gift: 设置初始依赖状态–轻松!...亲自了解编写使用临时Docker容器中运行的实际服务的测试有多么容易和

    Foxpro 开发答疑160问

    82. 如何使用_StopWatch类实现计时程序设计 317 83. 如何利用_ShortcutMenu类进行动态快捷菜单设计 321 84. 如何使用WinZip Manager类进行文件压缩和解压缩 325 第7章 网络应用 332 85. 如何获得本机IP地址 ...

    Java 利用多线程实现文件的分片下载

    Main方法是运行开始的方法,里面StopWatch是测速工具类,如果要想使用请导入相关maven坐标,不想使用直接删除即可。 内容概要: 这是随手写的一个利用线程池下载文件的小玩具,如果刚学完线程池不知道怎么使用的,...

    并行计算课程设计(代码+执行文件+文档)

    虽然没有按时完成作业,但这份报告花了我好几天的时间,从开始的搭建并行计算平台到最后的程序运行成功可以说是对我的一个锻炼。每一次的遇到问题与每一次的解决问题都是一个成长。每一次遇到问题和解决问题都是一种...

    VB编程资源大全(源码 其它3)

    shellwait.zip 在程序中运行另一个exe程序直到它运行结束(1KB) 666,unloadforms.zip 卸装所有的forms(1KB) 667,startfile.zip 在程序中运行另一个exe程序(6KB) 668,killapp.zip 终止另一个程序...

    VB编程资源大全(源码 其它1)

    shellwait.zip 在程序中运行另一个exe程序直到它运行结束(1KB) 666,unloadforms.zip 卸装所有的forms(1KB) 667,startfile.zip 在程序中运行另一个exe程序(6KB) 668,killapp.zip 终止另一个程序...

    VB编程资源大全(源码 其它2)

    shellwait.zip 在程序中运行另一个exe程序直到它运行结束(1KB) 666,unloadforms.zip 卸装所有的forms(1KB) 667,startfile.zip 在程序中运行另一个exe程序(6KB) 668,killapp.zip 终止另一个程序...

    VB编程资源大全(源码 其它4)

    shellwait.zip 在程序中运行另一个exe程序直到它运行结束(1KB) 666,unloadforms.zip 卸装所有的forms(1KB) 667,startfile.zip 在程序中运行另一个exe程序(6KB) 668,killapp.zip 终止另一个程序...

    jirastopwatch:没有更多的时间跟踪-只是更简单的时间跟踪

    Jira StopWatch已经过编译和测试,可以在带有Linux Mint 17.0上运行。 拥有MacOSX的任何人:我想知道所有事情是否都可以立即使用。 执照 Apache License版本2.0-请阅读 反馈 错误报告,功能要求等。 请为此使用...

    virtual-clock:微型库,可配置虚拟时钟

    VirtualClock的时间是使用高分辨率时间数据计算的,这意味着时钟时间不受JavaScript计时器的不精确性,系统时钟漂移或NTP等软件的偏斜影响。 这使其非常适合用于例如图形渲染循环中,在这些循环中,时序不应与软件...

Global site tag (gtag.js) - Google Analytics