当前位置: 代码网 > it编程>编程语言>C# > C# Stopwatch实现计算代码运行时间

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

2024年05月18日 C# 我要评论
前言我们编写程序时,有时需要统计代码运行时间,比如记录视频解码耗时,以及视频的播放帧率等以确认性能满足,或者记录代码运行时长作为优化的依据。通常的做法是定义一个变量记录起始时间,在结束时获取当前时间减

前言

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

一、计算范围时间

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

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com