博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# Stopwatch与TimeSpan详解
阅读量:6005 次
发布时间:2019-06-20

本文共 15355 字,大约阅读时间需要 51 分钟。

最近项目使用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 thefollowing output. It creates several TimeSpan objects anddisplays the values of the TimeSpan properties for each.TimeSpan( 1 )                                     00:00:00.0000001Days               0       TotalDays          1.15740740740741E-12Hours              0       TotalHours         2.77777777777778E-11Minutes            0       TotalMinutes       1.66666666666667E-09Seconds            0       TotalSeconds                      1E-07Milliseconds       0       TotalMilliseconds                0.0001                           Ticks                                 1TimeSpan( 111222333444555 )                   128.17:30:33.3444555Days             128       TotalDays              128.729552597865Hours             17       TotalHours             3089.50926234875Minutes           30       TotalMinutes           185370.555740925Seconds           33       TotalSeconds           11122233.3444555Milliseconds     344       TotalMilliseconds      11122233344.4555                           Ticks                   111222333444555TimeSpan( 10, 20, 30, 40, 50 )                 10.20:30:40.0500000Days              10       TotalDays              10.8546302083333Hours             20       TotalHours                   260.511125Minutes           30       TotalMinutes                 15630.6675Seconds           40       TotalSeconds                  937840.05Milliseconds      50       TotalMilliseconds             937840050                           Ticks                     9378400500000TimeSpan( 1111, 2222, 3333, 4444, 5555 )     1205.22:47:09.5550000Days            1205       TotalDays              1205.94941614583Hours             22       TotalHours                28942.7859875Minutes           47       TotalMinutes              1736567.15925Seconds            9       TotalSeconds              104194029.555Milliseconds     555       TotalMilliseconds          104194029555                           Ticks                  1041940295550000FromDays( 20.84745602 )                        20.20:20:20.2000000Days              20       TotalDays              20.8474560185185Hours             20       TotalHours             500.338944444444Minutes           20       TotalMinutes           30020.3366666667Seconds           20       TotalSeconds                  1801220.2Milliseconds     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毫秒。

 

 

 

 

转载地址:http://wnbmx.baihongyu.com/

你可能感兴趣的文章
c++中的虚函数
查看>>
遍历form表单里面的表单元素,取其value
查看>>
PHP TP框架基础
查看>>
directive ngChecked
查看>>
面试110道题
查看>>
python 08 文件操作
查看>>
强势解决:windows 不能在本地计算机中起动Tomcat参考特定错误代码1
查看>>
Gradle 配置debug和release工程目录
查看>>
curl指令的使用
查看>>
LNAMP第二版(nginx 1.2.0+apache 2.4.2+php 5.4)
查看>>
MongoDB repl set权限认证配置步骤
查看>>
java学习笔记(1)
查看>>
禁止Mysql默认端口访问Internet - MySQL - IT技术网
查看>>
基于用户投票的排名算法(二):Reddit
查看>>
下午最后的草坪
查看>>
Maven学习总结(七)——eclipse中使用Maven创建Web项目
查看>>
用PHP读取和编写XML DOM4
查看>>
1.部分(苹果)移动端的cookie不支持中文字符,2.从json字符串变为json对象时,只支持对象数组...
查看>>
vim配置及快捷键
查看>>
2018省赛赛第一次训练题解和ac代码
查看>>