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计算代码运行时间内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Winform圆形环绕的Loading动画实现代码

    Winform圆形环绕的Loading动画实现代码

    这篇文章主要介绍了Winform圆形环绕的Loading动画实现代码,有需要的朋友可以参考一下
    2014-01-01
  • C#实现鼠标裁剪图像功能

    C#实现鼠标裁剪图像功能

    这篇文章主要为大家详细介绍了C#实现鼠标裁剪图像功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 简单聊聊c# 事件

    简单聊聊c# 事件

    这篇文章主要介绍了c# 事件的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • C#中类的异常处理详解

    C#中类的异常处理详解

    大家好,本篇文章主要讲的是C#中类的异常处理详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • C#实现字符串与图片的Base64编码转换操作示例

    C#实现字符串与图片的Base64编码转换操作示例

    这篇文章主要介绍了C#实现字符串与图片的Base64编码转换操作,结合实例形式分析了C#针对base64编码与图片的相互转换操作技巧,需要的朋友可以参考下
    2017-06-06
  • c#实现爬虫程序

    c#实现爬虫程序

    这篇文章介绍了c#实现爬虫程序的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C# ODP.NET 调用Oracle函数返回值时报错的一个解决方案

    C# ODP.NET 调用Oracle函数返回值时报错的一个解决方案

    这篇文章主要介绍了C# ODP.NET 调用Oracle函数返回值时报错的一个解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • C# Winfom 中ListBox的简单用法详解

    C# Winfom 中ListBox的简单用法详解

    这篇文章主要介绍了C# Winfom 中ListBox的简单用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Http上传与Ftp上传的区别详解

    Http上传与Ftp上传的区别详解

    本篇文章是对Http上传与Ftp上传的区别进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • c#:CTS类型系统

    c#:CTS类型系统

    CTS通用类型系统,是.Net中一套定义类型的规则。我们要掌握c#开发,首先要建立这个类型概念,只有知道c#的元素是什么类型,才能进行相关的分析和选材。
    2012-12-12

最新评论