本篇內容主要講解“C#中的Stopwatch如何使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C#中的Stopwatch如何使用”吧!
Stopwatch:提供一組方法和屬性,可以準確的測量運行時間。
使用的時候需要引用命名空間:System.Diagnostics。
//創建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();
一般測量時間間隔使用的是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); }
/// <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如何使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。