溫馨提示×

溫馨提示×

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

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

C#中的Stopwatch如何使用

發布時間:2023-02-25 10:43:23 來源:億速云 閱讀:166 作者:iii 欄目:開發技術

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

    C# Stopwatch的使用

    什么是Stopwatch

    Stopwatch:提供一組方法和屬性,可以準確的測量運行時間。

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

    Stopwatch的簡單使用

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

    C#使用Stopwatch精確測量運行時間

    一般測量時間間隔使用的是DateTime.Now實例的DateTime.Ticks當前屬性,想要精確測量一個操作的運行時間就只能使用Stopwatch類計時了。

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

    測量耗時操作的運行時間

                Stopwatch stopWatch = new Stopwatch();
                stopWatch.Start();
                Thread.Sleep(5000); // 耗時操作
                stopWatch.Stop();
                
    
                // 將經過的時間作為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);
    
                // 將經過的時間作為毫秒數
                long mSeconds = stopWatch.ElapsedMilliseconds;
                Console.WriteLine("RunTime(ms) " + mSeconds);
    
                // 獲取經過時間的計時器刻度
                // 也可在耗時操作前后使用Stopwatch.GetTimestamp()各獲取1個Ticks值,然后相減得到耗時操作花費的計時器刻度
                // 計時器采用的計時方式不同,tick的時間單位不同
                long tick = stopWatch.ElapsedTicks;
                Console.WriteLine("RunTime(tick) " + tick);
    
                if (Stopwatch.IsHighResolution)
                {
                    // 計時器刻度是高性能計時器滴答數
                    Console.WriteLine("使用系統高分辨率性能計數器計時:");
                    Console.WriteLine("  RunTime(ns) " +tick* ((1000L * 1000L * 1000L)/ Stopwatch.Frequency));
                }
                else
                {
                    // 計時器刻度是DateTime.Now實例的DateTime.Ticks當前屬性
                    Console.WriteLine("使用DateTime類計時:");
                    Console.WriteLine("  RunTime(ns) " + tick * 100);
                }

    查看Stopwatch計時器的計時方式

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

    附上官網上的一個測試實例

            private static void TimeOperations()
            {
                long nanosecPerTick = (1000L * 1000L * 1000L) / Stopwatch.Frequency;
                const long numIterations = 10000;
    
                // 定義操作標題名稱
                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");
    
                // 從字符串解析整數的四種不同實現
                for (int operation = 0; operation <= 3; operation++)
                {
                    // 定義操作統計的變量
                    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();
    
                    // 運行當前操作10001次。
                    // 第一次執行時間將被丟棄,因為它可能會扭曲平均時間。
                    for (int i = 0; i <= numIterations; i++)
                    {
                        long ticksThisTime = 0;
                        int inputNum;
                        Stopwatch timePerParse;
    
                        switch (operation)
                        {
                            case 0:
                                // 使用try-catch語句分析有效整數
                                // 啟動新的秒表計時器
                                timePerParse = Stopwatch.StartNew();
                                try
                                {
                                    inputNum = Int32.Parse("0");
                                }
                                catch (FormatException)
                                {
                                    inputNum = 0;
                                }
    
                                // 停止計時器,并保存操作所用的計時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;
                        }
                        // 跳過第一個操作的時間,以防它導致一次性性能下降。
                        if (i == 0)
                        {
                            time10kOperations.Reset();
                            time10kOperations.Start();
                        }
                        else
                        {
                            // 更新迭代1-10001的操作統計信息。
                            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次迭代的統計信息
                    time10kOperations.Stop();
                    milliSec = time10kOperations.ElapsedMilliseconds;
    
                    Console.WriteLine();
                    Console.WriteLine("{0} 統計:", 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如何使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女