C#?Stopwatch實現計算代碼運行時間
前言
我們編寫程序時,有時需要統計代碼運行時間,比如記錄視頻解碼耗時,以及視頻的播放幀率等以確認性能滿足,或者記錄代碼運行時長作為優(yōu)化的依據。通常的做法是定義一個變量記錄起始時間,在結束時獲取當前時間減去起始時間,本文將上述操作封裝為一些對象方便使用。
一、計算范圍時間
我們使用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: "解碼");
}
效果預覽

二、計算檢查點時間
檢查點通??梢杂糜谟嬎阊h(huán)或者回調的耗時,比如播放視頻過程中放置一個檢查點,就可以計算出幀率。我們還是使用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計算代碼運行時間內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Winform圓形環(huán)繞的Loading動畫實現代碼
這篇文章主要介紹了Winform圓形環(huán)繞的Loading動畫實現代碼,有需要的朋友可以參考一下2014-01-01
C# ODP.NET 調用Oracle函數返回值時報錯的一個解決方案
這篇文章主要介紹了C# ODP.NET 調用Oracle函數返回值時報錯的一個解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-12-12

