文章目录
- 前言
- 一、计算范围时间
- 1、起始位置
- 2、结束位置
- 3、获取时间
- 封装成对象
- (1)、完整代码
- (2)、使用示例
- 二、计算检查点时间
- 1、初始化
- 2、检查点
- 封装成对象
- (1)、完整代码
- (2)、使用示例
- 总结
前言
我们编写程序时,有时需要统计代码运行时间,比如记录视频解码耗时,以及视频的播放帧率等以确认性能满足,或者记录代码运行时长作为优化的依据。通常的做法是定义一个变量记录起始时间,在结束时获取当前时间减去起始时间,本文将上述操作封装为一些对象方便使用。
一、计算范围时间
我们使用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进行了一个封装,主要目的是方便调用,而且也将均值计算出来了,这样有利于对数据的统计,总的来说还是有一定适用场景的。