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#超市收银系统设计

    C#超市收银系统设计

    这篇文章主要为大家详细介绍了C#超市收银系统设计,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • C#实现鼠标左右键切换效果

    C#实现鼠标左右键切换效果

    这篇文章主要为大家详细介绍了如何利用C#实现鼠标左右键切换功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • C# 静态变量与静态方法实例研究

    C# 静态变量与静态方法实例研究

    写了一个翻译英汉单词辞典的小程序,发现在调用几千次的时候速度很慢
    2011-11-11
  • C#实现Word转PDF的方法总结

    C#实现Word转PDF的方法总结

    这篇文章主要为大家详细介绍了C#中实现Word转PDF的常用方法,文中的示例代码讲解详细,具有一定的学习价值,有需要的小伙伴可以参考下
    2023-10-10
  • C#算法设计之关于1000瓶水的问题

    C#算法设计之关于1000瓶水的问题

    这篇文章主要介绍了C#算法设计之关于1000瓶水的问题,是一个比较经典的算法问题,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • C#难点逐个击破(6):C#数据类型与.net framework数据类型

    C#难点逐个击破(6):C#数据类型与.net framework数据类型

    最近开始看Illustrator C#2008,这真是一本好书,我读计算机书籍这么多了,能让我称为好书的没有多少。
    2010-02-02
  • Unity3D Shader实现流光效果

    Unity3D Shader实现流光效果

    这篇文章主要为大家详细介绍了Unity3D Shader实现流光效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C# GetMethod方法的应用实例讲解

    C# GetMethod方法的应用实例讲解

    GetMethod 是获取当前 Type 的特定方法,具有多个重载, GetMethod 即使用指定的绑定约束搜索指定方法,本文给大家介绍了C# GetMethod方法的应用实例,需要的朋友可以参考下
    2024-04-04
  • c#中禁用windows的任务管理器的方法

    c#中禁用windows的任务管理器的方法

    这篇文章主要介绍了c#中禁用windows的任务管理器的方法,通过注册表实现禁用,需要的朋友可以参考下
    2014-06-06
  • C#将布尔类型转换成字节数组的方法

    C#将布尔类型转换成字节数组的方法

    这篇文章主要介绍了C#将布尔类型转换成字节数组的方法,涉及C#中字符串函数的使用技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04

最新评论