C# Stopwatch实现计算代码运行时间

 更新时间:2024年03月13日 08:21:55   作者:CodeOfCC  
这篇文章主要为大家详细介绍了C#如何使用Stopwatch实现计算代码运行时间,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

前言

我们编写程序时,有时需要统计代码运行时间,比如记录视频解码耗时,以及视频的播放帧率等以确认性能满足,或者记录代码运行时长作为优化的依据。通常的做法是定义一个变量记录起始时间,在结束时获取当前时间减去起始时间,本文将上述操作封装为一些对象方便使用。

一、计算范围时间

我们使用Stopwatch就很容易做到。

1、起始位置

 Stopwatch _sw = Stopwatch.StartNew();
_sw.Start();

2、结束位置

 _sw.Stop();

3、获取时间

//单位秒
Time = _sw.ElapsedMilliseconds / 1000.0;

封装成对象

(1)完整代码

public class RangeCodeTime
{
    Stopwatch _sw = Stopwatch.StartNew();
    Queue<double> _times = new Queue<double>();
    double _sum = 0;
    int _maxAvgCount = 0;
    /// <summary>
    /// 当前耗时时,单位秒
    /// </summary>
    public double Time { get; set; }
    /// <summary>
    /// 平均耗时时,单位秒
    /// </summary>
    public double Average { get; set; }
    /// <summary>
    /// 构造方法
    /// </summary>
    /// <param name="maxAvgCount">计算平均总共个数</param>
    public RangeCodeTime(int maxAvgCount = 60)
    {
        _maxAvgCount = maxAvgCount;
    }
    /// <summary>
    /// 开始点
    /// </summary>
    public void Begin()
    {
        _sw.Restart();
    }
    /// <summary>
    /// 结束点
    /// </summary>
    /// <param name="isPrint">是否打印</param>
    /// <param name="printLable">打印的标签</param>
    public void End(bool isPrint = true, string printLable = "")
    {
        _sw.Stop();
        Time = _sw.ElapsedMilliseconds / 1000.0;
        _times.Enqueue(Time);
        _sum += Time;
        Average = _sum / _times.Count;
        Console.WriteLine(printLable + "当前耗时(s):" + Time + " 平均耗时(s):" + Average);
        if (_times.Count >= _maxAvgCount)
        {
            _sum -= _times.Dequeue();
        }
    }
}

(2)使用示例

RangeCodeTime rct = new RangeCodeTime();
void test()
{
    rct.Beigin();
    //需要计算时长的代码
    //默认会输出到控制台,isPrint=true。也可以在End()之后通过属性Time、和Average获取数据。
    rct.End(printLable: "解码");
}

效果预览

二、计算检查点时间

检查点通常可以用于计算循环或者回调的耗时,比如播放视频过程中放置一个检查点,就可以计算出帧率。我们还是使用Stopwatch来实现。

1、初始化

Stopwatch _sw = Stopwatch.StartNew();

2、检查点

if (!_sw.IsRunning)
{
    _sw.Restart();
}
else
{
    _sw.Stop();
    //单位秒
    Time = _sw.ElapsedMilliseconds / 1000.0;
    _sw.Restart();
}

封装成对象

(1)完整代码

public class CheckPointCodeTime
{
    Stopwatch _sw = Stopwatch.StartNew();
    Queue<double> _times = new Queue<double>();
    double _sum = 0;
    int _maxAvgCount = 0;
    /// <summary>
    /// 当前耗时时,单位秒
    /// </summary>
    public double Time { get; set; }
    /// <summary>
    /// 平均耗时时,单位秒
    /// </summary>
    public double Average { get; set; }
    /// <summary>
    /// 构造方法
    /// </summary>
    /// <param name="maxAvgCount">计算平均总共个数</param>
    public CheckPointCodeTime(int maxAvgCount = 60)
    {
        _maxAvgCount = maxAvgCount;
    }
    /// <summary>
    /// 检查点
    /// </summary>
    /// <param name="isPrint">是否打印</param>
    /// <param name="printLable">打印的标签</param>
    public void Check(bool isPrint = true, string printLable = "")
    {
        if (!_sw.IsRunning)
        {
            _sw.Restart();
            return;
        }
        _sw.Stop();
        Time = _sw.ElapsedMilliseconds / 1000.0;
        _times.Enqueue(Time);
        _sum += Time;
        Average = _sum / _times.Count;
        Console.WriteLine(printLable + "当前耗时(s):" + Time + " 平均耗时(s):" + Average);
        if (_times.Count >= _maxAvgCount)
        {
            _sum -= _times.Dequeue();
        }
        _sw.Restart();
    }
}

(2)使用示例

CheckPointCodeTime cct= new CheckPointCodeTime();
//接收视频数据包回调
void onReceivePacket()
{ 
    //默认会输出到控制台,isPrint=true。也可以在Check()之后通过属性Time、和Average获取数据。
   cct.Check(printLable:"接收一帧 ");
  //其他处理
}

效果预览

总结

本文简单的Stopwatch进行了一个封装,主要目的是方便调用,而且也将均值计算出来了,这样有利于对数据的统计,总的来说还是有一定适用场景的。

到此这篇关于C# Stopwatch实现计算代码运行时间的文章就介绍到这了,更多相关C# Stopwatch计算代码运行时间内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C# WPF编程之Application类的使用详解

    C# WPF编程之Application类的使用详解

    每个运行中的WPF应用程序都由System.Windows.Application类的一个实例来表示,该类跟踪在应用程序中打开的所有窗口,决定何时关闭应用程序,下面就跟随小编一起来深入了解下Application类的使用吧
    2024-04-04
  • C#程序优化-有效减少CPU占用率

    C#程序优化-有效减少CPU占用率

    本文给大家介绍的是C#程序优化的小技巧,通过此方法可以有效的降低CPU的占用率,十分的简单实用,有需要的小伙伴可以参考下。
    2015-06-06
  • C#中HslCommunication库的实现示例

    C#中HslCommunication库的实现示例

    C# HslCommunication库是一个用于建立TCP连接并进行Modbus通讯的库,使用该库可以方便地建立TCP连接,并进行读写操作,下面就来详细的介绍一下,感兴趣的可以了解一下
    2025-12-12
  • c#使用反射调用类型成员示例

    c#使用反射调用类型成员示例

    学习C#的时候就知道使用反射可以对我们编程提供极大的便利(动态的获取信息、调用类型成员、创建实例等等),下面示例说明一下使用方法
    2014-01-01
  • C#生成防伪码的思路及源码分享

    C#生成防伪码的思路及源码分享

    生成防伪码其实挺简单,但是如果要考虑效率和不重复的话,就需要稍微动动脑子了,下面我来说说我的思路及源码
    2014-06-06
  • C#百万数据查询出现超时问题的解决方法

    C#百万数据查询出现超时问题的解决方法

    这篇文章主要介绍了C#百万数据查询出现超时问题的解决方法,是非常实用的技巧,需要的朋友可以参考下
    2014-09-09
  • 基于Unity3D实现3D迷宫小游戏的示例代码

    基于Unity3D实现3D迷宫小游戏的示例代码

    迷宫游戏作为经典的小游戏,一直深受大家的喜爱。本文小编将为大家详细介绍一下如何用Unity实现一个3D版的迷宫小游戏,感兴趣的可以动手试一试
    2022-03-03
  • C#基于QRCode实现动态生成自定义二维码图片功能示例

    C#基于QRCode实现动态生成自定义二维码图片功能示例

    这篇文章主要介绍了C#基于QRCode实现动态生成自定义二维码图片功能,结合实例形式分析了C#使用QRCode动态生成二维码图片相关操作技巧,需要的朋友可以参考下
    2019-02-02
  • C#设置文件权限的方法

    C#设置文件权限的方法

    这篇文章主要介绍了C#设置文件权限的方法,文中讲解非常细致,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2020-08-08
  • C#逐行读取文本文件的几种有效方法

    C#逐行读取文本文件的几种有效方法

    在C#中,我们可以使用各种方法来读取和写入文本文件,本文主要给大家介绍了C#逐行读取文本文件的几种有效方法,并通过代码示例讲解的非常详细,需要的朋友可以参考下
    2025-01-01

最新评论