使用.NET 2.0中的秒表-Stopwatch类进行速度测试

简介:
 软件的运行速度必须要在用户可以接受的范围内。通常,改善那些短暂的但频繁使用的例程的速度会大幅度地提高软件的整体速度。
    要改善速度,当然首先要能够量度时间。好,那我们考虑一下在跑道上的情况,枪声一响,马上按下秒表开始计时,在选手到达终点那一刻结束计时,这时就可以知道该选手所用的时间了。要开始对下一轮比赛计时前,要先将秒表归零。.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结果:
    在结束计时后下一步就是读取计时结果了。Stopwatch类提供了以下属性:
  1. Elapsed:返回一个TimeSpan对象,表示计时时间间隔;
  2. ElapsedMilliseconds:返回计时经过的微秒数,精确度稍差,适合于稍长一点的计时;
  3. 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方法可以开始一个新的计时器。


    参考: http://www.blackwasp.co.uk/SpeedTestWithStopwatch.aspx

 

本文转自一个程序员的自省博客园博客,原文链接:http://www.cnblogs.com/anderslly/archive/2006/12/17/stopwatchspeedtesting.html,如需转载请自行联系原作者。


目录
相关文章
|
测试技术 持续交付 API
深入挖掘探索.NET单元测试
【10月更文挑战第11天】
132 2
|
开发框架 .NET C#
C#|.net core 基础 - 删除字符串最后一个字符的七大类N种实现方式
【10月更文挑战第9天】在 C#/.NET Core 中,有多种方法可以删除字符串的最后一个字符,包括使用 `Substring` 方法、`Remove` 方法、`ToCharArray` 与 `Array.Copy`、`StringBuilder`、正则表达式、循环遍历字符数组以及使用 LINQ 的 `SkipLast` 方法。
376 8
|
10月前
|
JSON 安全 API
.net 自定义日志类
在.NET中,创建自定义日志类有助于更好地管理日志信息。示例展示了如何创建、配置和使用日志记录功能,包括写入日志文件、设置日志级别、格式化消息等。注意事项涵盖时间戳、日志级别、JSON序列化、线程安全、日志格式、文件处理及示例使用。请根据需求调整代码。
159 13
|
10月前
|
算法 Java 测试技术
使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试
使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试
239 13
|
10月前
|
JSON 数据格式
.net HTTP请求类封装
`HttpRequestHelper` 是一个用于简化 HTTP 请求的辅助类,支持发送 GET 和 POST 请求。它使用 `HttpClient` 发起请求,并通过 `Newtonsoft.Json` 处理 JSON 数据。示例展示了如何使用该类发送请求并处理响应。注意事项包括:简单的错误处理、需安装 `Newtonsoft.Json` 依赖,以及建议重用 `HttpClient` 实例以优化性能。
257 2
|
10月前
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
445 13
|
测试技术 开发者
vertx的学习总结6之动态代理类和测试
本文是Vert.x学习系列的第六部分,介绍了如何使用动态代理在事件总线上公开服务,以及如何进行Vert.x组件的异步测试,包括动态代理的创建和使用,以及JUnit 5和Vert.x测试工具的结合使用。
109 3
vertx的学习总结6之动态代理类和测试
|
12月前
|
Java 程序员 测试技术
Java|让 JUnit4 测试类自动注入 logger 和被测 Service
本文介绍如何通过自定义 IDEA 的 JUnit4 Test Class 模板,实现生成测试类时自动注入 logger 和被测 Service。
211 5
|
测试技术 API 开发者
精通.NET单元测试:MSTest、xUnit、NUnit全面解析
【10月更文挑战第15天】本文介绍了.NET生态系统中最流行的三种单元测试框架:MSTest、xUnit和NUnit。通过示例代码展示了每种框架的基本用法和特点,帮助开发者根据项目需求和个人偏好选择合适的测试工具。
451 3
|
11月前
|
开发框架 安全 .NET
.NET使用Moq开源模拟库简化单元测试
.NET使用Moq开源模拟库简化单元测试~
155 0