外观
Stopwatch计时器
如果需要计算多段的总耗时 每段之间stop后,start(),最后sw.ElapsedMilliseconds 获取总时间 如果需要单独计算,使用 restart()
Stopwatch stopwatch = new Stopwatch();
// 启动计时器
stopwatch.Start();
// TODO: 在这里执行需要测试的代码块的第一部分
// 记录第一部分的执行时间
TimeSpan elapsedTimePart1 = stopwatch.Elapsed;
Console.WriteLine("第一部分执行时间:{0}", elapsedTimePart1);
// 重启计时器
stopwatch.Restart();
// TODO: 在这里执行需要测试的代码块的第二部分
// 记录第二部分的执行时间
TimeSpan elapsedTimePart2 = stopwatch.Elapsed;
Console.WriteLine("第二部分执行时间:{0}", elapsedTimePart2);
// 停止计时器
stopwatch.Stop();![[Pasted image 20231121085635.png]]
高精度 低开销
在NET7后有新的api GetTimestamp()、 GetElapsedTime()
- GetTimestamp 获取当前时间戳
- GetElapsedTime 获取时间
var startTime = Stopwatch.GetTimestamp();
await Task.Delay(1000);
var diff = Stopwatch.GetElapsedTime(startTime);
Console.WriteLine(diff); //耗时背后的源码解析:
//StartNew的源码就是一个静态类 实例一个对象然后返回使用 存在内存分配
public static Stopwatch StartNew()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
return stopwatch;
}
//调用的是win32 API的原生API 无内存分配基本无开销
public static long GetTimestamp() => Stopwatch.QueryPerformanceCounter();
private static unsafe long QueryPerformanceCounter()
{
long num;
Interop.Kernel32.QueryPerformanceCounter(&num);
return num;
}总结
如果版本允许 尽量使用GetTimestamp
