Stopwatch是C#中精确测量代码执行时间的首选工具,基于高性能计数器提供微秒级精度。1. 通过Start()和Stop()控制计时,ElapsedMilliseconds获取毫秒耗时;2. Elapsed属性支持TotalSeconds、TotalMilliseconds等多单位输出;3. 静态StartNew()方法简化实例创建与启动;4. 支持Reset()重置和Restart()重启(.NET 4.5+);5. 依赖系统高精度计时源,频率由Stopwatch.Frequency返回,确保精准测量。正确使用可有效评估性能。

在C#中,System.Diagnostics.Stopwatch 是用于精确测量代码执行时间的常用工具。相比使用 DateTime.Now 或 Environment.TickCount,Stopwatch 提供了更高的精度和更简单的操作接口,特别适合性能测试、算法对比或调试耗时操作。
1. 基本用法
Stopwatch 的使用非常简单。只需创建实例,调用 Start() 开始计时,执行目标代码后调用 Stop() 停止计时,然后通过 Elapsed 属性获取经过的时间。
var stopwatch = new System.Diagnostics.Stopwatch();
stopwatch.Start();
// 要测量的代码
for (int i = 0; i < 100000; i++)
{
Math.Sqrt(i);
}
stopwatch.Stop();
Console.WriteLine($"执行耗时: {stopwatch.ElapsedMilliseconds} 毫秒");
2. 获取不同单位的时间
Elapsed 属性返回 TimeSpan 类型,可以提取多种时间单位:
- ElapsedMilliseconds:以毫秒为单位的总耗时(long)
- ElapsedTicks:计时器刻度数(高精度)
- Elapsed.TotalSeconds:以秒为单位的总耗时(double,包含小数)
- Elapsed.TotalMilliseconds:包含小数部分的毫秒数
例如:
Console.WriteLine($"总秒数: {stopwatch.Elapsed.TotalSeconds:F6}");
Console.WriteLine($"总毫秒: {stopwatch.Elapsed.TotalMilliseconds:F3}");
3. 静态方法简化调用
可以使用 Stopwatch 的静态方法 StartNew() 直接创建并启动计时器,更加简洁:
var sw = Stopwatch.StartNew();
// 执行代码...
sw.Stop();
Console.WriteLine($"耗时: {sw.ElapsedMilliseconds} ms");
4. 重复使用与重置
Stopwatch 实例可以重复使用。调用 Reset() 可将已用时间清零,Restart() 则会停止并重新开始计时。
sw.Reset(); // 清零 sw.Start(); // 再次开始 // 或者直接重启 sw.Restart();
注意:.NET Framework 4.5+ 才支持 Restart() 方法。
5. 高精度原理说明
Stopwatch 底层依赖于系统高性能计数器(如 Windows 的 QueryPerformanceCounter),其精度远高于普通时间函数。可通过静态属性 Stopwatch.IsHighResolution 确认是否使用高精度计时源。
频率信息可通过 Stopwatch.Frequency 获取,通常为每秒几百万个刻度,确保微秒级甚至更高精度测量。
基本上就这些。Stopwatch 使用简单,精度高,是C#中测量执行时间的首选方式。只要记得及时 Start 和 Stop,避免空跑或重复计时,就能准确评估代码性能。不复杂但容易忽略细节。










