Skip to content

Stopwatch计时器

约 320 字大约 1 分钟

NET

2023-09-27

如果需要计算多段的总耗时 每段之间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