概述 # {7 } k$ y& s, {' K/ T* \
计算一段程序的耗时是我们在编程中很常见的用法,那这节内容就通过实例的方式来演示几种常用的统计耗时的方法.
5 p) N! s/ p% @; u 方法一:stopwatch 1 D2 E9 y8 C& u: A; A
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start();
Thread.Sleep(999);
sw.Stop();
Console.WriteLine($"程序耗时:{sw.ElapsedMilliseconds}ms.");
Console.ReadKey();
}
最常用的计算耗时的就是使用Stopwatch,使用的时候需要引用命名空间:System.Diagnostics.
9 M4 D0 O2 S2 I/ ^8 v) j 运行结果:
9 |; I2 w) \7 x5 R: M 程序耗时:1012ms.
3 d+ L. e0 Y' w; M, n' Z6 f- Z
方法二:DateTime.Now ) U: _! b& |/ H% { v# P
static void Main(string[] args)
{
//Stopwatch sw = new Stopwatch();
//sw.Start();
//Thread.Sleep(999);
//sw.Stop();
//Console.WriteLine($"程序耗时:{sw.ElapsedMilliseconds}ms.");
var start = DateTime.Now;
Thread.Sleep(999);
var stop = DateTime.Now;
Console.WriteLine($"程序耗时:{(stop - start).TotalMilliseconds}ms.");
Console.ReadKey();
}
运行结果:
0 ^. C' G- I/ w; M
程序耗时:1012.2267ms.
& s' E* a. w! G9 C7 k& @! R
方法三:ValueStopwatch 2 C2 R9 C. [+ x# K( G% I2 M. j; p3 H
用法举例如下:
$ M2 k+ E6 x) u6 y2 X4 H- \+ \ using System;
using System.Diagnostics;
using System.Threading;
namespace ConsoleApp27
{
class Program
{
static void Main(string[] args)
{
//Stopwatch sw = new Stopwatch();
//sw.Start();
//Thread.Sleep(999);
//sw.Stop();
//Console.WriteLine($"程序耗时:{sw.ElapsedMilliseconds}ms.");
//var start = DateTime.Now;
//Thread.Sleep(999);
//var stop = DateTime.Now;
//Console.WriteLine($"程序耗时:{(stop - start).TotalMilliseconds}ms.");
var watch = ValueStopwatch.StartNew();
Thread.Sleep(999);
Console.WriteLine($"程序耗时:{watch.GetElapsedTime().TotalMilliseconds}ms.");
Console.ReadKey();
}
}
internal struct ValueStopwatch
{
private static readonly double TimestampToTicks = TimeSpan.TicksPerSecond / (double)Stopwatch.Frequency;
private readonly long _startTimestamp;
public bool IsActive => _startTimestamp != 0;
private ValueStopwatch(long startTimestamp)
{
_startTimestamp = startTimestamp;
}
public static ValueStopwatch StartNew() => new ValueStopwatch(Stopwatch.GetTimestamp());
public TimeSpan GetElapsedTime()
{
// Start timestamp can't be zero in an initialized ValueStopwatch. It would have to be literally the first thing executed when the machine boots to be 0.
// So it being 0 is a clear indication of default(ValueStopwatch)
if (!IsActive)
{
throw new InvalidOperationException("An uninitialized, or 'default', ValueStopwatch cannot be used to get elapsed time.");
}
var end = Stopwatch.GetTimestamp();
var timestampDelta = end - _startTimestamp;
var ticks = (long)(TimestampToTicks * timestampDelta);
return new TimeSpan(ticks);
}
}
}
运行结果:
1 L: z" D" c. J5 O4 W0 X 程序耗时:1008.0426ms.