.NET v2.0 下的高精度计数器 —— Stopwatch [.NET v2.0, C#]
.NET v2.0 下的高精度计数器 —— Stopwatch [.NET v2.0, C#]
Written by Allen Lee
无论你是搞技术研究还是搞项目开发,高精度的时间测量在很多场合下都是必需的。xiaotie 在其《dotnet下时间精度测量》提到了一个 QueryPerfCounter,它对目前还在使用 Microsoft .NET Framework v1.1 的开发人员来说的确是一个好帮手。但若你已经用上了 Microsoft .NET Framework v2.0,那么 Stopwatch 将会成为你进行高精度时间测量的不二选择。
1. 测试 Stopwatch
这里,我借用一下 xiaotie 在《dotnet下时间精度测量》的测试代码,并给出对应的运行结果:

















































































从测试结果中可以看到,Stopwatch 绝对能够满足挑剔的你!怎么样?手痒了吗?
2. 应用 Stopwatch
Stopwatch 位于 System.Diagnostics 命名空间中,它的使用方法非常简单,只要你会用一般的计时器,你就会使用它。
2.1 创建实例
你可以通过 new 或者 Stopwatch.StartNew() 来创建一个 Stopwatch 实例:




使用 StartNew() 会创建一个 Stopwatch 实例并马上开始计时,即等效于如下代码:




2.2 测量时间







2.3 应用示例
微软官方提供了一系列示范程序用于演示 Visual Studio 2005,其中 Basic Class Library 部分带有一个 Stopwatch 的 Windows Forms 示例程序,你可以到 101 Samples for Visual Studio 2005 下载示例代码。
3. 深入 Stopwatch
Stopwatch 内部也调用了 QueryPerformanceCounter() 和 QueryPerformanceFrequency() 两个函数,与 QueryPerfCounter 不同的是,当 Stopwatch 检测到当前的系统和硬件不支持高精度的计数器时,它将转用我们所熟悉的 DateTime 做法。
Stopwatch 在其静态构造器中调用 QueryPerformanceFrequency(),透过该函数的返回值判断当前的系统和硬件是否支持高精度的计数器,并设置 IsHighResolution 属性的值。Stopwatch 内部用于计算时间间隔的主要方法都会根据 IsHighResolution 的值来选择合适的计算方法。有兴趣的话,你可以使用 Reflector 探究一下 Stopwatch 的内部。
· C# 模式匹配全解:原理、用法与易错点
· 记一次SSD性能瓶颈排查之路——寿命与性能之间的取舍
· 理解 .NET 结构体字段的内存布局
· .NET 9中的异常处理性能提升分析:为什么过去慢,未来快
· 字符集、编码的前世今生
· C# 模式匹配全解:原理、用法与易错点
· 杂七杂八系列----C#代码如何影响CPU缓存速度?
· C#/.NET/.NET Core优秀项目和框架2025年5月简报
· 鸿蒙仓颉语言开发实战教程:商城应用个人中心页面
· FFmpeg开发笔记(六十三)FFmpeg使用vvenc把视频转为H.266编码