首页 > 代码库 > C# Stopwatch与TimeSpan详解(转)
C# Stopwatch与TimeSpan详解(转)
转:http://www.cnblogs.com/newstart/archive/2012/09/21/2696884.html
最近项目使用socket通信,要测试接受时间和解析时间,达到微妙级别,这里在MSDN上找的资料记录下:
Stopwatch 实例可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间。 在典型的 Stopwatch 方案中,先调用 Start 方法,然后调用 Stop 方法,最后使用 Elapsed 属性检查运行时间。
Stopwatch 实例或者在运行,或者已停止;使用 IsRunning 可以确定 Stopwatch 的当前状态。 使用 Start 可以开始测量运行时间;使用 Stop 可以停止测量运行时间。 通过属性 Elapsed、ElapsedMilliseconds 或 ElapsedTicks 查询运行时间值。 当实例正在运行或已停止时,可以查询运行时间属性。 运行时间属性在 Stopwatch 运行期间稳固递增;在该实例停止时保持不变。
默认情况下,Stopwatch 实例的运行时间值相当于所有测量的时间间隔的总和。 每次调用 Start 时开始累计运行时间计数;每次调用 Stop 时结束当前时间间隔测量,并冻结累计运行时间值。 使用 Reset 方法可以清除现有 Stopwatch 实例中的累计运行时间。
Stopwatch 在基础计时器机制中对计时器的计时周期进行计数,从而测量运行时间。 如果安装的硬件和操作系统支持高分辨率性能计数器,则 Stopwatch 类将使用该计数器来测量运行时间; 否则,Stopwatch 类将使用系统计数器来测量运行时间。 使用 Frequency 和 IsHighResolution 字段可以确定实现 Stopwatch 计时的精度和分辨率。
Stopwatch 类为托管代码内与计时有关的性能计数器的操作提供帮助。 具体说来,Frequency 字段和 GetTimestamp 方法可以用于替换非托管 Win32 API QueryPerformanceFrequency 和 QueryPerformanceCounter。
说明
在多处理器计算机上,线程在哪个处理器上运行无关紧要。 但是,由于 BIOS 或硬件抽象层 (HAL) 中的 bug,在不同的处理器上可能会得出不同的计时结果。 若要为线程指定处理器关联,请使用 ProcessThread.ProcessorAffinity 方法。
using System;using System.Diagnostics;using System.Threading;class Program{ static void Main(string[] args) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); Thread.Sleep(10000); stopWatch.Stop(); // Get the elapsed time as a TimeSpan value. TimeSpan ts = stopWatch.Elapsed; // Format and display the TimeSpan value. string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10); Console.WriteLine("RunTime " + elapsedTime); }}
using System;using System.Diagnostics;namespace StopWatchSample{ class OperationsTimer { public static void Main() { DisplayTimerProperties(); Console.WriteLine(); Console.WriteLine("Press the Enter key to begin:"); Console.ReadLine(); Console.WriteLine(); TimeOperations(); } public static void DisplayTimerProperties() { // Display the timer frequency and resolution. if (Stopwatch.IsHighResolution) { Console.WriteLine("Operations timed using the system‘s high-resolution performance counter."); } else { Console.WriteLine("Operations timed using the DateTime class."); } long frequency = Stopwatch.Frequency; Console.WriteLine(" Timer frequency in ticks per second = {0}", frequency); long nanosecPerTick = (1000L*1000L*1000L) / frequency; Console.WriteLine(" Timer is accurate within {0} nanoseconds", nanosecPerTick); } private static void TimeOperations() { long nanosecPerTick = (1000L*1000L*1000L) / Stopwatch.Frequency; const long numIterations = 10000; // Define the operation title names. String [] operationNames = {"Operation: Int32.Parse(\"0\")", "Operation: Int32.TryParse(\"0\")", "Operation: Int32.Parse(\"a\")", "Operation: Int32.TryParse(\"a\")"}; // Time four different implementations for parsing // an integer from a string. for (int operation = 0; operation <= 3; operation++) { // Define variables for operation statistics. 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(); // Run the current operation 10001 times. // The first execution time will be tossed // out, since it can skew the average time. for (int i=0; i<=numIterations; i++) { long ticksThisTime = 0; int inputNum; Stopwatch timePerParse; switch (operation) { case 0: // Parse a valid integer using // a try-catch statement. // Start a new stopwatch timer. timePerParse = Stopwatch.StartNew(); try { inputNum = Int32.Parse("0"); } catch (FormatException) { inputNum = 0; } // Stop the timer, and save the // elapsed ticks for the operation. timePerParse.Stop(); ticksThisTime = timePerParse.ElapsedTicks; break; case 1: // Parse a valid integer using // the TryParse statement. // Start a new stopwatch timer. timePerParse = Stopwatch.StartNew(); if (!Int32.TryParse("0", out inputNum)) { inputNum = 0; } // Stop the timer, and save the // elapsed ticks for the operation. timePerParse.Stop(); ticksThisTime = timePerParse.ElapsedTicks; break; case 2: // Parse an invalid value using // a try-catch statement. // Start a new stopwatch timer. timePerParse = Stopwatch.StartNew(); try { inputNum = Int32.Parse("a"); } catch (FormatException) { inputNum = 0; } // Stop the timer, and save the // elapsed ticks for the operation. timePerParse.Stop(); ticksThisTime = timePerParse.ElapsedTicks; break; case 3: // Parse an invalid value using // the TryParse statement. // Start a new stopwatch timer. timePerParse = Stopwatch.StartNew(); if (!Int32.TryParse("a", out inputNum)) { inputNum = 0; } // Stop the timer, and save the // elapsed ticks for the operation. timePerParse.Stop(); ticksThisTime = timePerParse.ElapsedTicks; break; default: break; } // Skip over the time for the first operation, // just in case it caused a one-time // performance hit. if (i == 0) { time10kOperations.Reset(); time10kOperations.Start(); } else { // Update operation statistics // for iterations 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 ++; } } } // Display the statistics for 10000 iterations. time10kOperations.Stop(); milliSec = time10kOperations.ElapsedMilliseconds; Console.WriteLine(); Console.WriteLine("{0} Summary:", operationNames[operation]); Console.WriteLine(" Slowest time: #{0}/{1} = {2} ticks", indexSlowest, numIterations, maxTicks); Console.WriteLine(" Fastest time: #{0}/{1} = {2} ticks", indexFastest, numIterations, minTicks); Console.WriteLine(" Average time: {0} ticks = {1} nanoseconds", numTicks / numIterations, (numTicks * nanosecPerTick) / numIterations ); Console.WriteLine(" Total time looping through {0} operations: {1} milliseconds", numIterations, milliSec); } } }}
TimeSpan 对象表示时间间隔或持续时间,按正负天数、小时数、分钟数、秒数以及秒的小数部分进行度量。用于度量持续时间的最大时间单位是天。更大的时间单位(如月和年)的天数不同,因此为保持一致性,时间间隔以天为单位来度量。
TimeSpan 对象的值是等于所表示时间间隔的刻度数。一个刻度等于 100 纳秒,TimeSpan 对象的值的范围在 MinValue 和 MaxValue 之间。
TimeSpan 值可以表示为 [-]d.hh:mm:ss.ff,其中减号是可选的,它指示负时间间隔,d 分量表示天,hh 表示小时(24 小时制),mm 表示分钟,ss 表示秒,而 ff 为秒的小数部分。即,时间间隔包括整的正负天数、天数和剩余的不足一天的时长,或者只包含不足一天的时长。例如,初始化为 1.0e+13 刻度的 TimeSpan 对象的文本表示“11.13:46:40”,即 11 天,13 小时,46 分钟和 40 秒。
TimeSpan 类型实现了 System.IComparable 和 System.IComparable 接口。
// Example of the TimeSpan class properties. using System; class TimeSpanPropertiesDemo { const string headerFmt = "\n{0,-45}" ; const string dataFmt = "{0,-12}{1,8} {2,-18}{3,21}" ; // Display the properties of the TimeSpan parameter. static void ShowTimeSpanProperties( TimeSpan interval ) { Console.WriteLine( "{0,21}" , interval ); Console.WriteLine( dataFmt, "Days" , interval.Days, "TotalDays" , interval.TotalDays ); Console.WriteLine( dataFmt, "Hours" , interval.Hours, "TotalHours" , interval.TotalHours ); Console.WriteLine( dataFmt, "Minutes" , interval.Minutes, "TotalMinutes" , interval.TotalMinutes ); Console.WriteLine( dataFmt, "Seconds" , interval.Seconds, "TotalSeconds" , interval.TotalSeconds ); Console.WriteLine( dataFmt, "Milliseconds" , interval.Milliseconds, "TotalMilliseconds" , interval.TotalMilliseconds ); Console.WriteLine( dataFmt, null , null , "Ticks" , interval.Ticks ); } static void Main( ) { Console.WriteLine( "This example of the TimeSpan class properties " + "generates the \nfollowing output. It " + "creates several TimeSpan objects and \ndisplays " + "the values of the TimeSpan properties for each." ); // Create and display a TimeSpan value of 1 tick. Console.Write( headerFmt, "TimeSpan( 1 )" ); ShowTimeSpanProperties( new TimeSpan( 1 ) ); // Create a TimeSpan value with a large number of ticks. Console.Write( headerFmt, "TimeSpan( 111222333444555 )" ); ShowTimeSpanProperties( new TimeSpan( 111222333444555 ) ); // This TimeSpan has all fields specified. Console.Write( headerFmt, "TimeSpan( 10, 20, 30, 40, 50 )" ); ShowTimeSpanProperties( new TimeSpan( 10, 20, 30, 40, 50 ) ); // This TimeSpan has all fields overflowing. Console.Write( headerFmt, "TimeSpan( 1111, 2222, 3333, 4444, 5555 )" ); ShowTimeSpanProperties( new TimeSpan( 1111, 2222, 3333, 4444, 5555 ) ); // This TimeSpan is based on a number of days. Console.Write( headerFmt, "FromDays( 20.84745602 )" ); ShowTimeSpanProperties( TimeSpan.FromDays( 20.84745602 ) ); } } |
结果如下
/* This example of the TimeSpan class properties generates the following output. It creates several TimeSpan objects and displays the values of the TimeSpan properties for each. TimeSpan( 1 ) 00:00:00.0000001 Days 0 TotalDays 1.15740740740741E-12 Hours 0 TotalHours 2.77777777777778E-11 Minutes 0 TotalMinutes 1.66666666666667E-09 Seconds 0 TotalSeconds 1E-07 Milliseconds 0 TotalMilliseconds 0.0001 Ticks 1 TimeSpan( 111222333444555 ) 128.17:30:33.3444555 Days 128 TotalDays 128.729552597865 Hours 17 TotalHours 3089.50926234875 Minutes 30 TotalMinutes 185370.555740925 Seconds 33 TotalSeconds 11122233.3444555 Milliseconds 344 TotalMilliseconds 11122233344.4555 Ticks 111222333444555 TimeSpan( 10, 20, 30, 40, 50 ) 10.20:30:40.0500000 Days 10 TotalDays 10.8546302083333 Hours 20 TotalHours 260.511125 Minutes 30 TotalMinutes 15630.6675 Seconds 40 TotalSeconds 937840.05 Milliseconds 50 TotalMilliseconds 937840050 Ticks 9378400500000 TimeSpan( 1111, 2222, 3333, 4444, 5555 ) 1205.22:47:09.5550000 Days 1205 TotalDays 1205.94941614583 Hours 22 TotalHours 28942.7859875 Minutes 47 TotalMinutes 1736567.15925 Seconds 9 TotalSeconds 104194029.555 Milliseconds 555 TotalMilliseconds 104194029555 Ticks 1041940295550000 FromDays( 20.84745602 ) 20.20:20:20.2000000 Days 20 TotalDays 20.8474560185185 Hours 20 TotalHours 500.338944444444 Minutes 20 TotalMinutes 30020.3366666667 Seconds 20 TotalSeconds 1801220.2 Milliseconds 200 TotalMilliseconds 1801220200 Ticks 18012202000000 */ |
ps:
皮秒,符号ps(英语:picosecond ).
1皮秒等于一万亿分之一秒(10-12秒)
1,000 皮秒 = 1纳秒
1,000,000 皮秒 = 1微秒
1,000,000,000 皮秒 = 1毫秒
1,000,000,000,000 皮秒 = 1秒
纳秒
纳秒,符号ns(英语:nanosecond ).
1纳秒等于十亿分之一秒(10-9秒)
1 纳秒 = 1000皮秒
1,000 纳秒 = 1微秒
1,000,000 纳秒 = 1毫秒
1,000,000,000 纳秒 = 1秒
微秒,符号μs(英语:microsecond ).
1微秒等于一百万分之一秒(10-6秒)
0.000 001 微秒 = 1皮秒
0.001 微秒 = 1纳秒
1,000 微秒 = 1毫秒
1,000,000 微秒 = 1秒
毫秒
毫秒,符号ms(英语:millisecond ).
1毫秒等于一千分之一秒(10-3秒)
0.000 000 001 毫秒 = 1皮秒
0.000 001 毫秒 = 1纳秒
0.001 毫秒 = 1微秒
1000 毫秒 = 1秒
最好我测试出来结果是
timespan s=00:00:00.0008025
转换成Milliseconds ms=0.8025毫秒。
C# Stopwatch与TimeSpan详解(转)