如何在不使 CPU 不堪重负的情况下捕获每一毫秒

How to Capture Each New Millisecond Without Overwhelming the CPU

提问人:Mansour Fahad 提问时间:10/26/2023 更新时间:10/26/2023 访问量:54

问:

我在这里的要求是我需要以毫秒为单位连续更新时间,因此每经过一毫秒,我都需要捕获它并将其写入文件。我试图在一段时间内循环运行它,但我注意到该程序占用了超过 50% 的 CPU。我试图在每个周期结束时添加该方法,这导致跳过了一些毫秒。例:Thread.Sleep(1)

1698281344731

1698281344747

1698281344762

1698281344778

1698281344794

这是我的代码,希望有任何可以引导我走向正确方向的建议。

 while (true)
 {
     long CurrentMS = GetMilliseconds();
     Writer(CurrentMS);
     Console.Write(CurrentMS + "\r\n");
     Thread.Sleep(1);
 }
C# 循环 单线程

评论

1赞 nbk 10/26/2023
写作也要花费时间,就像你所看到的
1赞 Auditive 10/26/2023
可以引导你走向正确方向的建议:你绝对不需要每毫秒无限地为文件和控制台写一些东西)
1赞 500 - Internal Server Error 10/26/2023
以比屏幕刷新速度更快的速度将某些内容写入屏幕是没有意义的。无论如何,睡眠的默认分辨率是 15 毫秒,具体取决于 Windows 版本。如果需要,可以通过 timeBeginPeriod 调用将其重新编程为 1 毫秒 - 游戏和媒体应用程序经常这样做。
1赞 Jeremy Lakeman 10/26/2023
这是一个荒谬的要求,你应该拒绝。但是,如果您真的想生成一个表示每毫秒的数字列表,您可以检查当前时间,然后在再次睡觉之前遍历您错过的每个时间值。

答:

0赞 Jaklans 10/26/2023 #1

您可以卸载写入,使其仅在完成循环或每 x 次迭代后才进行。这样可以避免因写入磁盘而导致的任何速度变慢。最简单的方法是将字符串存储在列表中,然后在最后将它们全部写出来。

评论

0赞 500 - Internal Server Error 10/26/2023
我可以为此提供一个优化建议:只需记录初始时间戳,然后在将它们写出时从中生成以下时间戳:)