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进行了一个封装,主要目的是方便调用,而且也将均值计算出来了,这样有利于对数据的统计,总的来说还是有一定适用场景的。

相关推荐

  1. pta 计算火车运行时间

    2024-03-13 05:22:05       45 阅读
  2. C++计算程序运行时间

    2024-03-13 05:22:05       35 阅读
  3. 用python计算程序运行时间

    2024-03-13 05:22:05       56 阅读
  4. (C语言)精确计算程序运行时间的方法

    2024-03-13 05:22:05       58 阅读
  5. pta 计算火车运行时间 (15分)c语言

    2024-03-13 05:22:05       37 阅读
  6. 【C++】计算代码中程序的时间差

    2024-03-13 05:22:05       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-13 05:22:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-13 05:22:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-13 05:22:05       82 阅读
  4. Python语言-面向对象

    2024-03-13 05:22:05       91 阅读

热门阅读

  1. 双指针算法———C++

    2024-03-13 05:22:05       45 阅读
  2. docker搭建upload-labs

    2024-03-13 05:22:05       43 阅读
  3. 大数据开发(HBase面试真题-卷二)

    2024-03-13 05:22:05       42 阅读
  4. 嵌入式学习day36 数据结构

    2024-03-13 05:22:05       38 阅读
  5. 常用网络命令的使用

    2024-03-13 05:22:05       41 阅读
  6. 嵌入式学习day35

    2024-03-13 05:22:05       45 阅读
  7. openGauss gsql 常用元命令 一

    2024-03-13 05:22:05       33 阅读
  8. 3.11笔记2

    2024-03-13 05:22:05       31 阅读
  9. DevOps实战:Docker、Kubernetes与Jenkins的完美融合

    2024-03-13 05:22:05       41 阅读
  10. 爬虫(六)

    2024-03-13 05:22:05       35 阅读
  11. 【c++】运算符重载【赋值、关系、调用】

    2024-03-13 05:22:05       39 阅读