C#?Stopwatch實(shí)現(xiàn)計(jì)算代碼運(yùn)行時(shí)間
前言
我們編寫(xiě)程序時(shí),有時(shí)需要統(tǒng)計(jì)代碼運(yùn)行時(shí)間,比如記錄視頻解碼耗時(shí),以及視頻的播放幀率等以確認(rèn)性能滿足,或者記錄代碼運(yùn)行時(shí)長(zhǎng)作為優(yōu)化的依據(jù)。通常的做法是定義一個(gè)變量記錄起始時(shí)間,在結(jié)束時(shí)獲取當(dāng)前時(shí)間減去起始時(shí)間,本文將上述操作封裝為一些對(duì)象方便使用。
一、計(jì)算范圍時(shí)間
我們使用Stopwatch就很容易做到。
1、起始位置
Stopwatch _sw = Stopwatch.StartNew(); _sw.Start();
2、結(jié)束位置
_sw.Stop();
3、獲取時(shí)間
//單位秒 Time = _sw.ElapsedMilliseconds / 1000.0;
封裝成對(duì)象
(1)完整代碼
public class RangeCodeTime { Stopwatch _sw = Stopwatch.StartNew(); Queue<double> _times = new Queue<double>(); double _sum = 0; int _maxAvgCount = 0; /// <summary> /// 當(dāng)前耗時(shí)時(shí),單位秒 /// </summary> public double Time { get; set; } /// <summary> /// 平均耗時(shí)時(shí),單位秒 /// </summary> public double Average { get; set; } /// <summary> /// 構(gòu)造方法 /// </summary> /// <param name="maxAvgCount">計(jì)算平均總共個(gè)數(shù)</param> public RangeCodeTime(int maxAvgCount = 60) { _maxAvgCount = maxAvgCount; } /// <summary> /// 開(kāi)始點(diǎn) /// </summary> public void Begin() { _sw.Restart(); } /// <summary> /// 結(jié)束點(diǎn) /// </summary> /// <param name="isPrint">是否打印</param> /// <param name="printLable">打印的標(biāo)簽</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 + "當(dāng)前耗時(shí)(s):" + Time + " 平均耗時(shí)(s):" + Average); if (_times.Count >= _maxAvgCount) { _sum -= _times.Dequeue(); } } }
(2)使用示例
RangeCodeTime rct = new RangeCodeTime(); void test() { rct.Beigin(); //需要計(jì)算時(shí)長(zhǎng)的代碼 //默認(rèn)會(huì)輸出到控制臺(tái),isPrint=true。也可以在End()之后通過(guò)屬性Time、和Average獲取數(shù)據(jù)。 rct.End(printLable: "解碼"); }
效果預(yù)覽
二、計(jì)算檢查點(diǎn)時(shí)間
檢查點(diǎn)通??梢杂糜谟?jì)算循環(huán)或者回調(diào)的耗時(shí),比如播放視頻過(guò)程中放置一個(gè)檢查點(diǎn),就可以計(jì)算出幀率。我們還是使用Stopwatch來(lái)實(shí)現(xiàn)。
1、初始化
Stopwatch _sw = Stopwatch.StartNew();
2、檢查點(diǎn)
if (!_sw.IsRunning) { _sw.Restart(); } else { _sw.Stop(); //單位秒 Time = _sw.ElapsedMilliseconds / 1000.0; _sw.Restart(); }
封裝成對(duì)象
(1)完整代碼
public class CheckPointCodeTime { Stopwatch _sw = Stopwatch.StartNew(); Queue<double> _times = new Queue<double>(); double _sum = 0; int _maxAvgCount = 0; /// <summary> /// 當(dāng)前耗時(shí)時(shí),單位秒 /// </summary> public double Time { get; set; } /// <summary> /// 平均耗時(shí)時(shí),單位秒 /// </summary> public double Average { get; set; } /// <summary> /// 構(gòu)造方法 /// </summary> /// <param name="maxAvgCount">計(jì)算平均總共個(gè)數(shù)</param> public CheckPointCodeTime(int maxAvgCount = 60) { _maxAvgCount = maxAvgCount; } /// <summary> /// 檢查點(diǎn) /// </summary> /// <param name="isPrint">是否打印</param> /// <param name="printLable">打印的標(biāo)簽</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 + "當(dāng)前耗時(shí)(s):" + Time + " 平均耗時(shí)(s):" + Average); if (_times.Count >= _maxAvgCount) { _sum -= _times.Dequeue(); } _sw.Restart(); } }
(2)使用示例
CheckPointCodeTime cct= new CheckPointCodeTime(); //接收視頻數(shù)據(jù)包回調(diào) void onReceivePacket() { //默認(rèn)會(huì)輸出到控制臺(tái),isPrint=true。也可以在Check()之后通過(guò)屬性Time、和Average獲取數(shù)據(jù)。 cct.Check(printLable:"接收一幀 "); //其他處理 }
效果預(yù)覽
總結(jié)
本文簡(jiǎn)單的Stopwatch進(jìn)行了一個(gè)封裝,主要目的是方便調(diào)用,而且也將均值計(jì)算出來(lái)了,這樣有利于對(duì)數(shù)據(jù)的統(tǒng)計(jì),總的來(lái)說(shuō)還是有一定適用場(chǎng)景的。
到此這篇關(guān)于C# Stopwatch實(shí)現(xiàn)計(jì)算代碼運(yùn)行時(shí)間的文章就介紹到這了,更多相關(guān)C# Stopwatch計(jì)算代碼運(yùn)行時(shí)間內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Winform圓形環(huán)繞的Loading動(dòng)畫(huà)實(shí)現(xiàn)代碼
這篇文章主要介紹了Winform圓形環(huán)繞的Loading動(dòng)畫(huà)實(shí)現(xiàn)代碼,有需要的朋友可以參考一下2014-01-01C#實(shí)現(xiàn)字符串與圖片的Base64編碼轉(zhuǎn)換操作示例
這篇文章主要介紹了C#實(shí)現(xiàn)字符串與圖片的Base64編碼轉(zhuǎn)換操作,結(jié)合實(shí)例形式分析了C#針對(duì)base64編碼與圖片的相互轉(zhuǎn)換操作技巧,需要的朋友可以參考下2017-06-06C# ODP.NET 調(diào)用Oracle函數(shù)返回值時(shí)報(bào)錯(cuò)的一個(gè)解決方案
這篇文章主要介紹了C# ODP.NET 調(diào)用Oracle函數(shù)返回值時(shí)報(bào)錯(cuò)的一個(gè)解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12C# Winfom 中ListBox的簡(jiǎn)單用法詳解
這篇文章主要介紹了C# Winfom 中ListBox的簡(jiǎn)單用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12