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;
        if(isPrint)
        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;

2、检查点

if (_sw == null)
{
    _sw = Stopwatch.StartNew();
    return;
}
else
{
    _sw.Stop();
    //单位秒
    Time = _sw.ElapsedMilliseconds / 1000.0;
    _sw.Restart();
}

封装成对象

(1)、完整代码

public class CheckPointCodeTime
{
    Stopwatch? _sw;
    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 == null)
        {
            _sw = Stopwatch.StartNew();
            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进行了一个封装,主要目的是方便调用,而且也将均值计算出来了,这样有利于对数据的统计,总的来说还是有一定适用场景的。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeOfCC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值