在C#程序里想要知道一段逻辑跑了多久,最方便的做法就是使用System.Diagnostics命名空间下的Stopwatch类。它基于系统高精度计时器,能够给出比DateTime差值更稳定的耗时数据,适合用来做基础性能观察。

Stopwatch的基本使用步骤
使用Stopwatch测量代码耗时通常包含四个动作:创建实例、开始计时、停止计时、读取结果。下面用一个简单例子说明。
using System;
using System.Diagnostics;
class Program
{
static void Main()
{
// 创建Stopwatch实例
Stopwatch sw = new Stopwatch();
// 开始计时
sw.Start();
// 需要测量的代码块
for (int i = 0; i < 1000000; i++)
{
// 模拟一些计算
var temp = i * i;
}
// 停止计时
sw.Stop();
// 输出耗时(毫秒)
Console.WriteLine("耗时: " + sw.ElapsedMilliseconds + " ms");
}
}
常用属性和方法
除了上面用到的Start、Stop和ElapsedMilliseconds,Stopwatch还有几个实用的成员。
- Restart:重置并立即开始计时,适合循环中重复测量。
- Reset:清空已记录的时间,不开始计时。
- Elapsed:返回TimeSpan类型,可获取更精细的时间单位。
- IsRunning:判断当前是否正在计时。
使用Restart的示例
using System;
using System.Diagnostics;
class Test
{
static void Run()
{
Stopwatch sw = new Stopwatch();
for (int round = 0; round < 3; round++)
{
sw.Restart();
// 被测量的任务
System.Threading.Thread.Sleep(50);
sw.Stop();
Console.WriteLine("第" + round + "次耗时: " + sw.ElapsedMilliseconds);
}
}
}
注意事项
在实际使用中,有几点可以让测量结果更可信。
| 注意点 | 说明 |
|---|---|
| 多次测量 | 单次耗时容易受系统调度影响,建议跑多次取平均值。 |
| 避免优化干扰 | 被测代码若被编译器优化掉,可把结果赋值给变量并使用它。 |
| 精度差异 | 不同机器的高精度计时器频率不同,ElapsedTicks需结合Frequency理解。 |
小结
Stopwatch是C#中测量代码执行耗时的标准工具,调用Start和Stop就能拿到准确时间。掌握Restart和ElapsedMilliseconds等用法后,日常排查慢代码会轻松很多。