在C#中,使用 Stopwatch 比较简单粗糙的替代 WIN32 下 C++ 中调用的 QueryPerformanceCounter
C# 中自带的那个 System.Windows.Form.Timer 看上去是通过消息事件方式的,精度上好像小于10ms 就不行了。因为我想每秒把界面刷新60次,结果,Timer.Interval=16后(为啥16?因为1000/60=16.66667),测了一下,真实的刷新只能跑到每秒40次左右。除非我把 Intervel=10或更小的值后,才会达到60帧左右。
于是找了半天网络,有的方式是引用 kernel32.dll 的库,然后就可以在 C# 中调用 QueryPerformanceCounter。感觉不是那么优雅。
最后居然发现这个 Sytem.Diagnostics.Stopwatch。真的像 一个计时器一样,按一下,开始【Stopwatch.Start()】,再按一下暂停【Stopwatch.Stop()】,再按一下又继续【Stopwatch.Start()】,另一个按钮按一下就重新开始【Stopwatch.Restart()】。
而且的,真的很准的,说是可精确到 1ms。这对我来说是够了,我看了一下 Stopwatch.Frequency,也就是 我这电脑支持的 每秒多少 ticks,是10000000。这个类还提供了一个 IsHighResolution,供你判断你的硬件系统是否支持高精度。我的本本支持。
这里贴一段代码简单说明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | static void test2() { Stopwatch stopWatch = new Stopwatch(); stopWatch.Restart(); Thread.Sleep(1000); // Get the elapsed time as a TimeSpan value. TimeSpan ts = stopWatch.Elapsed; double m1 = stopWatch.ElapsedMilliseconds; //这里显示的时 Start() 或 Restart() 后开始的累计毫秒,Start()后若 Stop()了再 Start(),还是一样继续累计的。Restart() 才会重新开始累计。 double m2 = ts.Milliseconds; //这只是当前毫秒值,不是累计值 double m3 = ts.TotalMilliseconds; //这与 m1 一样 double t = ts.Ticks; // Format and display the TimeSpan value. string elapsedTime = String.Format( "m1:{0}, m2:{1}, m3:{2}, ticks:{3}" , m1, m2, m3, t); Console.WriteLine( "RunTime " + elapsedTime); stopWatch.Restart(); Thread.Sleep(3000); elapsedTime = String.Format( "ElapsedMilliseconds: {0}" , stopWatch.Elapsed.TotalMilliseconds); Console.WriteLine( "RunTime " + elapsedTime); stopWatch.Stop(); } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~