溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C#中的Stopwatch如何使用

發(fā)布時間:2023-02-25 10:43:23 來源:億速云 閱讀:135 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“C#中的Stopwatch如何使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“C#中的Stopwatch如何使用”吧!

    C# Stopwatch的使用

    什么是Stopwatch

    Stopwatch:提供一組方法和屬性,可以準(zhǔn)確的測量運(yùn)行時間。

    使用的時候需要引用命名空間:System.Diagnostics。

    Stopwatch的簡單使用

    //創(chuàng)建Stopwatch實(shí)例
    Stopwatch sw = new Stopwatch();
    //開始計(jì)時
    sw.Start();
    for (int i = 0; i < 100; i++)
    {
      Console.WriteLine(i);
    }
    //停止計(jì)時
    sw.Stop();
    Console.WriteLine("用時:" + sw.ElapsedMilliseconds + "");
    //重置 停止時間間隔測量,并將運(yùn)行時間重置為0
    sw.Reset();
    Console.WriteLine("用時:" + sw.ElapsedMilliseconds + "");
    //重啟 停止時間間隔測量,并將運(yùn)行時間重置為0,然后重新開始測量運(yùn)行時間
    sw.Restart();
    for (int i = 0; i < 100; i++)
    {
      Console.WriteLine(i);
    }
    sw.Stop();
    //獲取當(dāng)前實(shí)例測量得出的總運(yùn)行時間(以毫秒為單位)
    Console.WriteLine("用時:" + sw.ElapsedMilliseconds + "");
    //獲取當(dāng)前實(shí)例測量得出的總運(yùn)行時間
    Console.WriteLine("用時:"+sw.Elapsed); 
    //獲取當(dāng)前實(shí)例測量得出的總運(yùn)行時間(用計(jì)時器刻度表示)。
    Console.WriteLine(sw.ElapsedTicks);
    Console.Read();
    //使用StartNew,相當(dāng)于已經(jīng)實(shí)例化并且啟動計(jì)時
    Stopwatch sw=Stopwatch.StartNew();
    for (int i = 0; i < 100; i++)
    {
      Console.WriteLine(i);
    }
    sw.Stop();
    //獲取當(dāng)前實(shí)例測量得出的總運(yùn)行時間(以毫秒為單位)
    Console.WriteLine("用時:" + sw.ElapsedMilliseconds + "");
    //獲取當(dāng)前實(shí)例測量得出的總運(yùn)行時間
    Console.WriteLine("用時:"+sw.Elapsed); 
    Console.Read();

    C#使用Stopwatch精確測量運(yùn)行時間

    一般測量時間間隔使用的是DateTime.Now實(shí)例的DateTime.Ticks當(dāng)前屬性,想要精確測量一個操作的運(yùn)行時間就只能使用Stopwatch類計(jì)時了。

    Stopwatch計(jì)時精度取決于硬件,如果安裝的硬件和操作系統(tǒng)支持高分辨率性能計(jì)數(shù)器, 則Stopwatch類將使用該計(jì)數(shù)器來測量運(yùn)行時間。否則,Stopwatch類將使用系統(tǒng)計(jì)時器來測量運(yùn)行時間。

    測量耗時操作的運(yùn)行時間

                Stopwatch stopWatch = new Stopwatch();
                stopWatch.Start();
                Thread.Sleep(5000); // 耗時操作
                stopWatch.Stop();
                
    
                // 將經(jīng)過的時間作為TimeSpan值
                TimeSpan ts = stopWatch.Elapsed;
                // 格式和顯示時間值
                string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:000}-{4:000}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds, (ts.Ticks * 100 / 1000)%1000);
                Console.WriteLine("RunTime " + elapsedTime);
    
                // 將經(jīng)過的時間作為毫秒數(shù)
                long mSeconds = stopWatch.ElapsedMilliseconds;
                Console.WriteLine("RunTime(ms) " + mSeconds);
    
                // 獲取經(jīng)過時間的計(jì)時器刻度
                // 也可在耗時操作前后使用Stopwatch.GetTimestamp()各獲取1個Ticks值,然后相減得到耗時操作花費(fèi)的計(jì)時器刻度
                // 計(jì)時器采用的計(jì)時方式不同,tick的時間單位不同
                long tick = stopWatch.ElapsedTicks;
                Console.WriteLine("RunTime(tick) " + tick);
    
                if (Stopwatch.IsHighResolution)
                {
                    // 計(jì)時器刻度是高性能計(jì)時器滴答數(shù)
                    Console.WriteLine("使用系統(tǒng)高分辨率性能計(jì)數(shù)器計(jì)時:");
                    Console.WriteLine("  RunTime(ns) " +tick* ((1000L * 1000L * 1000L)/ Stopwatch.Frequency));
                }
                else
                {
                    // 計(jì)時器刻度是DateTime.Now實(shí)例的DateTime.Ticks當(dāng)前屬性
                    Console.WriteLine("使用DateTime類計(jì)時:");
                    Console.WriteLine("  RunTime(ns) " + tick * 100);
                }

    查看Stopwatch計(jì)時器的計(jì)時方式

            /// <summary>
            /// 顯示計(jì)時器屬性
            /// </summary>
            public static void DisplayTimerProperties()
            {
                // 顯示定時器頻率和分辨率
                if (Stopwatch.IsHighResolution)
                {
                    Console.WriteLine("操作使用系統(tǒng)高分辨率性能計(jì)數(shù)器計(jì)時");
                }
                else
                {
                    Console.WriteLine("操作使用DateTime類計(jì)時");
                }
    
                long frequency = Stopwatch.Frequency;
                Console.WriteLine("  計(jì)時器頻率,單位為每秒滴答數(shù) = {0}",
                    frequency);
                long nanosecPerTick = (1000L * 1000L * 1000L) / frequency;
                Console.WriteLine("  計(jì)時器分辨率為 {0} 納秒/滴答",
                    nanosecPerTick);
            }

    附上官網(wǎng)上的一個測試實(shí)例

            private static void TimeOperations()
            {
                long nanosecPerTick = (1000L * 1000L * 1000L) / Stopwatch.Frequency;
                const long numIterations = 10000;
    
                // 定義操作標(biāo)題名稱
                String[] operationNames = {"操作: Int32.Parse(\"0\")",
                                               "操作: Int32.TryParse(\"0\")",
                                               "操作: Int32.Parse(\"a\")",
                                               "操作: Int32.TryParse(\"a\")"};
                Console.WriteLine();
                Console.WriteLine("注:1ticks=100ns,1s=1000ms,1ms=1000us,1us=1000ns");
    
                // 從字符串解析整數(shù)的四種不同實(shí)現(xiàn)
                for (int operation = 0; operation <= 3; operation++)
                {
                    // 定義操作統(tǒng)計(jì)的變量
                    long numTicks = 0;
                    long numRollovers = 0;
                    long maxTicks = 0;
                    long minTicks = Int64.MaxValue;
                    int indexFastest = -1;
                    int indexSlowest = -1;
                    long milliSec = 0;
    
                    Stopwatch time10kOperations = Stopwatch.StartNew();
    
                    // 運(yùn)行當(dāng)前操作10001次。
                    // 第一次執(zhí)行時間將被丟棄,因?yàn)樗赡軙で骄鶗r間。
                    for (int i = 0; i <= numIterations; i++)
                    {
                        long ticksThisTime = 0;
                        int inputNum;
                        Stopwatch timePerParse;
    
                        switch (operation)
                        {
                            case 0:
                                // 使用try-catch語句分析有效整數(shù)
                                // 啟動新的秒表計(jì)時器
                                timePerParse = Stopwatch.StartNew();
                                try
                                {
                                    inputNum = Int32.Parse("0");
                                }
                                catch (FormatException)
                                {
                                    inputNum = 0;
                                }
    
                                // 停止計(jì)時器,并保存操作所用的計(jì)時ticks
    
                                timePerParse.Stop();
                                ticksThisTime = timePerParse.ElapsedTicks;
                                break;
                            case 1:                           
                                timePerParse = Stopwatch.StartNew();
                                if (!Int32.TryParse("0", out inputNum))
                                {
                                    inputNum = 0;
                                }
                                timePerParse.Stop();
                                ticksThisTime = timePerParse.ElapsedTicks;
                                break;
                            case 2:                            
                                timePerParse = Stopwatch.StartNew();
                                try
                                {
                                    inputNum = Int32.Parse("a");
                                }
                                catch (FormatException)
                                {
                                    inputNum = 0;
                                }
                                timePerParse.Stop();
                                ticksThisTime = timePerParse.ElapsedTicks;
                                break;
                            case 3:                           
                                timePerParse = Stopwatch.StartNew();
                                if (!Int32.TryParse("a", out inputNum))
                                {
                                    inputNum = 0;
                                }                            
                                timePerParse.Stop();
                                ticksThisTime = timePerParse.ElapsedTicks;
                                break;
                            default:
                                break;
                        }
                        // 跳過第一個操作的時間,以防它導(dǎo)致一次性性能下降。
                        if (i == 0)
                        {
                            time10kOperations.Reset();
                            time10kOperations.Start();
                        }
                        else
                        {
                            // 更新迭代1-10001的操作統(tǒng)計(jì)信息。
                            if (maxTicks < ticksThisTime)
                            {
                                indexSlowest = i;
                                maxTicks = ticksThisTime;
                            }
                            if (minTicks > ticksThisTime)
                            {
                                indexFastest = i;
                                minTicks = ticksThisTime;
                            }
                            numTicks += ticksThisTime;
                            if (numTicks < ticksThisTime)
                            {
                                // Keep track of rollovers.
                                numRollovers++;
                            }
                        }
                    }
    
                    // 顯示10000次迭代的統(tǒng)計(jì)信息
                    time10kOperations.Stop();
                    milliSec = time10kOperations.ElapsedMilliseconds;
    
                    Console.WriteLine();
                    Console.WriteLine("{0} 統(tǒng)計(jì):", operationNames[operation]);
                    Console.WriteLine("  最慢時間:  第{0}/{1}次操作,時間為{2} ticks",
                        indexSlowest, numIterations, maxTicks);
                    Console.WriteLine("  最快時間:  第{0}/{1}次操作,時間為{2} ticks",
                        indexFastest, numIterations, minTicks);
                    Console.WriteLine("  平均時間:  {0} ticks = {1} ns",
                        numTicks / numIterations,
                        (numTicks * nanosecPerTick) / numIterations);
                    Console.WriteLine("  {0} 次操作的總時間: {1} ms",
                        numIterations, milliSec);
                }
            }

    到此,相信大家對“C#中的Stopwatch如何使用”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI