C#中Stopwatch的使用及說明
C# Stopwatch的使用
什么是Stopwatch
Stopwatch:提供一組方法和屬性,可以準確的測量運行時間。
使用的時候需要引用命名空間:System.Diagnostics。
Stopwatch的簡單使用
//創(chuàng)建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,相當于已經(jīng)實例化并且啟動計時 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計時精度取決于硬件,如果安裝的硬件和操作系統(tǒng)支持高分辨率性能計數(shù)器, 則Stopwatch類將使用該計數(shù)器來測量運行時間。否則,Stopwatch類將使用系統(tǒng)計時器來測量運行時間。
測量耗時操作的運行時間
? ? ? ? ? ? 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)過時間的計時器刻度 ? ? ? ? ? ? // 也可在耗時操作前后使用Stopwatch.GetTimestamp()各獲取1個Ticks值,然后相減得到耗時操作花費的計時器刻度 ? ? ? ? ? ? // 計時器采用的計時方式不同,tick的時間單位不同 ? ? ? ? ? ? long tick = stopWatch.ElapsedTicks; ? ? ? ? ? ? Console.WriteLine("RunTime(tick) " + tick); ? ? ? ? ? ? if (Stopwatch.IsHighResolution) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? // 計時器刻度是高性能計時器滴答數(shù) ? ? ? ? ? ? ? ? Console.WriteLine("使用系統(tǒng)高分辨率性能計數(shù)器計時:"); ? ? ? ? ? ? ? ? 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("操作使用系統(tǒng)高分辨率性能計數(shù)器計時"); ? ? ? ? ? ? } ? ? ? ? ? ? else ? ? ? ? ? ? { ? ? ? ? ? ? ? ? Console.WriteLine("操作使用DateTime類計時"); ? ? ? ? ? ? } ? ? ? ? ? ? long frequency = Stopwatch.Frequency; ? ? ? ? ? ? Console.WriteLine(" ?計時器頻率,單位為每秒滴答數(shù) = {0}", ? ? ? ? ? ? ? ? frequency); ? ? ? ? ? ? long nanosecPerTick = (1000L * 1000L * 1000L) / frequency; ? ? ? ? ? ? Console.WriteLine(" ?計時器分辨率為 {0} 納秒/滴答", ? ? ? ? ? ? ? ? nanosecPerTick); ? ? ? ? }
附上官網(wǎng)上的一個測試實例
? ? ? ? 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"); ? ? ? ? ? ? // 從字符串解析整數(shù)的四種不同實現(xiàn) ? ? ? ? ? ? for (int operation = 0; operation <= 3; operation++) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? // 定義操作統(tǒng)計的變量 ? ? ? ? ? ? ? ? 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次。 ? ? ? ? ? ? ? ? // 第一次執(zhí)行時間將被丟棄,因為它可能會扭曲平均時間。 ? ? ? ? ? ? ? ? for (int i = 0; i <= numIterations; i++) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? long ticksThisTime = 0; ? ? ? ? ? ? ? ? ? ? int inputNum; ? ? ? ? ? ? ? ? ? ? Stopwatch timePerParse; ? ? ? ? ? ? ? ? ? ? switch (operation) ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? case 0: ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 使用try-catch語句分析有效整數(shù) ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 啟動新的秒表計時器 ? ? ? ? ? ? ? ? ? ? ? ? ? ? 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的操作統(tǒng)計信息。 ? ? ? ? ? ? ? ? ? ? ? ? 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)計信息 ? ? ? ? ? ? ? ? time10kOperations.Stop(); ? ? ? ? ? ? ? ? milliSec = time10kOperations.ElapsedMilliseconds; ? ? ? ? ? ? ? ? Console.WriteLine(); ? ? ? ? ? ? ? ? Console.WriteLine("{0} 統(tǒng)計:", 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); ? ? ? ? ? ? } ? ? ? ? }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C#使用System.Threading.Timer實現(xiàn)計時器的示例詳解
以往一般都是用 System.Timers.Timer 來做計時器,其實 System.Threading.Timer 也可以實現(xiàn)計時器功能,下面就跟隨小編一起來學習一下如何使用System.Threading.Timer實現(xiàn)計時器功能吧2024-01-01C#中使用DevExpress中的ChartControl實現(xiàn)極坐標圖的案例詳解
這篇文章主要介紹了在C#中使用DevExpress中的ChartControl實現(xiàn)極坐標圖,本案例是使用的是DevExpress 18.1.3版本,之前在14版本上也試過,但是有一個弊端就是實現(xiàn)極坐標圖的時候,第一個點和最后一個點總是自動多一條閉合線,會形成一個閉合的多邊形,因此升級了一下版2022-02-02C#中Trim()、TrimStart()、TrimEnd()的用法介紹
這篇文章主要介紹了C#中Trim()、TrimStart()、TrimEnd()的用法,有需要的朋友可以參考一下2014-01-01DevExpress實現(xiàn)為TextEdit設(shè)置水印文字的方法
這篇文章主要介紹了DevExpress實現(xiàn)為TextEdit設(shè)置水印文字的方法,對C#程序設(shè)計人員來說是一個很實用的技巧,需要的朋友可以參考下2014-08-08

關(guān)于Flyweight模式應(yīng)用實踐的相關(guān)介紹

c#使用filesystemwatcher實時監(jiān)控文件目錄的添加和刪除