欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#?Stopwatch實(shí)現(xiàn)計(jì)算代碼運(yùn)行時(shí)間

 更新時(shí)間:2024年03月13日 08:21:55   作者:CodeOfCC  
這篇文章主要為大家詳細(xì)介紹了C#如何使用Stopwatch實(shí)現(xiàn)計(jì)算代碼運(yùn)行時(shí)間,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

前言

我們編寫(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)代碼

    這篇文章主要介紹了Winform圓形環(huán)繞的Loading動(dòng)畫(huà)實(shí)現(xiàn)代碼,有需要的朋友可以參考一下
    2014-01-01
  • C#實(shí)現(xiàn)鼠標(biāo)裁剪圖像功能

    C#實(shí)現(xiàn)鼠標(biāo)裁剪圖像功能

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)鼠標(biāo)裁剪圖像功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 簡(jiǎn)單聊聊c# 事件

    簡(jiǎn)單聊聊c# 事件

    這篇文章主要介紹了c# 事件的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • C#中類(lèi)的異常處理詳解

    C#中類(lèi)的異常處理詳解

    大家好,本篇文章主要講的是C#中類(lèi)的異常處理詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • C#實(shí)現(xiàn)字符串與圖片的Base64編碼轉(zhuǎn)換操作示例

    C#實(shí)現(xiàn)字符串與圖片的Base64編碼轉(zhuǎn)換操作示例

    這篇文章主要介紹了C#實(shí)現(xiàn)字符串與圖片的Base64編碼轉(zhuǎn)換操作,結(jié)合實(shí)例形式分析了C#針對(duì)base64編碼與圖片的相互轉(zhuǎn)換操作技巧,需要的朋友可以參考下
    2017-06-06
  • c#實(shí)現(xiàn)爬蟲(chóng)程序

    c#實(shí)現(xiàn)爬蟲(chóng)程序

    這篇文章介紹了c#實(shí)現(xiàn)爬蟲(chóng)程序的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C# ODP.NET 調(diào)用Oracle函數(shù)返回值時(shí)報(bào)錯(cuò)的一個(gè)解決方案

    C# 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-12
  • C# Winfom 中ListBox的簡(jiǎn)單用法詳解

    C# 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
  • Http上傳與Ftp上傳的區(qū)別詳解

    Http上傳與Ftp上傳的區(qū)別詳解

    本篇文章是對(duì)Http上傳與Ftp上傳的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • c#:CTS類(lèi)型系統(tǒng)

    c#:CTS類(lèi)型系統(tǒng)

    CTS通用類(lèi)型系統(tǒng),是.Net中一套定義類(lèi)型的規(guī)則。我們要掌握c#開(kāi)發(fā),首先要建立這個(gè)類(lèi)型概念,只有知道c#的元素是什么類(lèi)型,才能進(jìn)行相關(guān)的分析和選材。
    2012-12-12

最新評(píng)論