C#?Stopwatch實現(xiàn)計算代碼運行時間
前言
我們編寫程序時,有時需要統(tǒng)計代碼運行時間,比如記錄視頻解碼耗時,以及視頻的播放幀率等以確認性能滿足,或者記錄代碼運行時長作為優(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">計算平均總共個數(shù)</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獲取數(shù)據。 rct.End(printLable: "解碼"); }
效果預覽
二、計算檢查點時間
檢查點通??梢杂糜谟嬎阊h(huán)或者回調的耗時,比如播放視頻過程中放置一個檢查點,就可以計算出幀率。我們還是使用Stopwatch來實現(xiàn)。
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">計算平均總共個數(shù)</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(); //接收視頻數(shù)據包回調 void onReceivePacket() { //默認會輸出到控制臺,isPrint=true。也可以在Check()之后通過屬性Time、和Average獲取數(shù)據。 cct.Check(printLable:"接收一幀 "); //其他處理 }
效果預覽
總結
本文簡單的Stopwatch進行了一個封裝,主要目的是方便調用,而且也將均值計算出來了,這樣有利于對數(shù)據的統(tǒng)計,總的來說還是有一定適用場景的。
到此這篇關于C# Stopwatch實現(xiàn)計算代碼運行時間的文章就介紹到這了,更多相關C# Stopwatch計算代碼運行時間內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Winform圓形環(huán)繞的Loading動畫實現(xiàn)代碼
這篇文章主要介紹了Winform圓形環(huán)繞的Loading動畫實現(xiàn)代碼,有需要的朋友可以參考一下2014-01-01C#實現(xiàn)字符串與圖片的Base64編碼轉換操作示例
這篇文章主要介紹了C#實現(xiàn)字符串與圖片的Base64編碼轉換操作,結合實例形式分析了C#針對base64編碼與圖片的相互轉換操作技巧,需要的朋友可以參考下2017-06-06C# ODP.NET 調用Oracle函數(shù)返回值時報錯的一個解決方案
這篇文章主要介紹了C# ODP.NET 調用Oracle函數(shù)返回值時報錯的一個解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-12-12