您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“C#中的Stopwatch如何使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“C#中的Stopwatch如何使用”吧!
Stopwatch:提供一組方法和屬性,可以準(zhǔn)確的測量運(yùn)行時間。
使用的時候需要引用命名空間:System.Diagnostics。
//創(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();
一般測量時間間隔使用的是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)行時間。
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); }
/// <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); }
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í)!
免責(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)容。