最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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í)一下

前言

我們編寫程序時(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>
    /// 開始點(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()之后通過屬性Time、和Average獲取數(shù)據(jù)。
    rct.End(printLable: "解碼");
}

效果預(yù)覽

二、計(jì)算檢查點(diǎn)時(shí)間

檢查點(diǎn)通常可以用于計(jì)算循環(huán)或者回調(diào)的耗時(shí),比如播放視頻過程中放置一個(gè)檢查點(diǎn),就可以計(jì)算出幀率。我們還是使用Stopwatch來實(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()之后通過屬性Time、和Average獲取數(shù)據(jù)。
   cct.Check(printLable:"接收一幀 ");
  //其他處理
}

效果預(yù)覽

總結(jié)

本文簡(jiǎn)單的Stopwatch進(jìn)行了一個(gè)封裝,主要目的是方便調(diào)用,而且也將均值計(jì)算出來了,這樣有利于對(duì)數(shù)據(jù)的統(tǒng)計(jì),總的來說還是有一定適用場(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)文章

最新評(píng)論

新泰市| 博白县| 大名县| 黄石市| 林周县| 天柱县| 乳山市| 浮梁县| 河间市| 江城| 老河口市| 浮梁县| 秦安县| 南宁市| 临高县| 双城市| 大悟县| 裕民县| 巴楚县| 高清| 板桥市| 惠安县| 铁岭县| 来安县| 宁海县| 晋中市| 岗巴县| 永善县| 垦利县| 兴安盟| 岑溪市| 新余市| 黑龙江省| 平泉县| 都兰县| 资讯 | 鹤峰县| 吉首市| 阳新县| 深水埗区| 荆门市|