C#-用Stopwatch类进行性能(时间)测试

2023-10-07 17:58

本文主要是介绍C#-用Stopwatch类进行性能(时间)测试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C#-用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类提供了以下属性:

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

这篇关于C#-用Stopwatch类进行性能(时间)测试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/159456

相关文章

Python日期和时间完全指南与实战

《Python日期和时间完全指南与实战》在软件开发领域,‌日期时间处理‌是贯穿系统设计全生命周期的重要基础能力,本文将深入解析Python日期时间的‌七大核心模块‌,通过‌企业级代码案例‌揭示最佳实践... 目录一、背景与核心价值二、核心模块详解与实战2.1 datetime模块四剑客2.2 时区处理黄金法

Java进行日期解析与格式化的实现代码

《Java进行日期解析与格式化的实现代码》使用Java搭配ApacheCommonsLang3和Natty库,可以实现灵活高效的日期解析与格式化,本文将通过相关示例为大家讲讲具体的实践操作,需要的可以... 目录一、背景二、依赖介绍1. Apache Commons Lang32. Natty三、核心实现代

C#特性(Attributes)和反射(Reflection)详解

《C#特性(Attributes)和反射(Reflection)详解》:本文主要介绍C#特性(Attributes)和反射(Reflection),具有很好的参考价值,希望对大家有所帮助,如有错误... 目录特性特性的定义概念目的反射定义概念目的反射的主要功能包括使用反射的基本步骤特性和反射的关系总结特性

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据

macOS Sequoia 15.5 发布: 改进邮件和屏幕使用时间功能

《macOSSequoia15.5发布:改进邮件和屏幕使用时间功能》经过常规Beta测试后,新的macOSSequoia15.5现已公开发布,但重要的新功能将被保留到WWDC和... MACOS Sequoia 15.5 正式发布!本次更新为 Mac 用户带来了一系列功能强化、错误修复和安全性提升,进一步增

Pandas进行周期与时间戳转换的方法

《Pandas进行周期与时间戳转换的方法》本教程将深入讲解如何在pandas中使用to_period()和to_timestamp()方法,完成时间戳与周期之间的转换,并结合实际应用场景展示这些方法的... 目录to_period() 时间戳转周期基本操作应用示例to_timestamp() 周期转时间戳基

C#实现查找并删除PDF中的空白页面

《C#实现查找并删除PDF中的空白页面》PDF文件中的空白页并不少见,因为它们有可能是作者有意留下的,也有可能是在处理文档时不小心添加的,下面我们来看看如何使用Spire.PDFfor.NET通过C#... 目录安装 Spire.PDF for .NETC# 查找并删除 PDF 文档中的空白页C# 添加与删

通过C#获取Excel单元格的数据类型的方法详解

《通过C#获取Excel单元格的数据类型的方法详解》在处理Excel文件时,了解单元格的数据类型有助于我们正确地解析和处理数据,本文将详细介绍如何使用FreeSpire.XLS来获取Excel单元格的... 目录引言环境配置6种常见数据类型C# 读取单元格数据类型引言在处理 Excel 文件时,了解单元格

C#实现高性能Excel百万数据导出优化实战指南

《C#实现高性能Excel百万数据导出优化实战指南》在日常工作中,Excel数据导出是一个常见的需求,然而,当数据量较大时,性能和内存问题往往会成为限制导出效率的瓶颈,下面我们看看C#如何结合EPPl... 目录一、技术方案核心对比二、各方案选型建议三、性能对比数据四、核心代码实现1. MiniExcel

JavaScript时间戳与时间的转化常用方法

《JavaScript时间戳与时间的转化常用方法》在JavaScript中,时间戳(Timestamp)通常指Unix时间戳,即从1970年1月1日00:00:00UTC到某个时间点经过的毫秒数,下面... 目录1. 获取当前时间戳2. 时间戳 → 时间对象3. 时间戳php → 格式化字符串4. 时间字符