【问题标题】:Stopwatch which runs faster than 15ms [duplicate]运行速度超过 15 毫秒的秒表 [重复]
【发布时间】:2015-05-14 10:23:54
【问题描述】:

目前我有一个计时器,我假设它每 5 毫秒调用一次在 TimerCallback 字段中定义的方法,但是在阅读了 Timer 类及其分辨率后,我发现 Timer 类只有 15 毫秒的分辨率或更高。

例如

autoDispatchTimer = new Timer(new TimerCallback(this.SendData), null, 0, 5);

我也考虑过使用Stopwatch,因为这确实可以实现更高的分辨率,但我仍然不确定如何使用Stopwatch 来执行相同的操作。无论如何,这可以使用Stopwatch 对象来完成吗?

会不会是读取ElapsedMilliseconds 属性并在那里调用SendData 方法的情况,还是我误解了C# 中Stopwatch 的工作原理?

非常感谢您对此查询的帮助。

编辑:我完全理解计时器的精度为 15 毫秒,因此我剩下的问题是询问更快的替代方案。现已修改标题以反映这一点。

【问题讨论】:

  • 你不能有这个,因为系统时间精度是 15ms
  • 我建议你看看线程
  • 从技术上讲,您可以使用NtSetTimerResolution 来加快 Windows 中的线程调度,但我建议您不要这样做。仍然没有保证。
  • 15ms的时间精度是Windows 7:msdn.microsoft.com/en-us/library/….
  • 即使你有这个,它也不太可能有用。你打算每 5 毫秒(即每秒 200 次)开始什么工作,这与每 15 毫秒做三件事明显不同? SendData 意味着通过网络发送数据。仅网络抖动就会打乱那些超精确的时序。

标签: c# timer stopwatch


【解决方案1】:

问题是Timer 在后台暂停,并且在某个时候有时间做某事。这保证不会比您的计时器中指定的时间快(因此它需要至少指定的时间,它可能需要更多时间)。我通常会在它回来之前需要几毫秒。 timer accuracy is 15ms on Windows 7 and higher,所以没有机会像这样更快地获得它。

唯一比Timer 更快的是while 循环。你可以使用它,或者重新考虑你的设计(至少,我会这样做)。

【讨论】:

    【解决方案2】:

    计时器分辨率documentation 说:

    系统计时器分辨率决定 Windows 执行两次的频率 主要行动:

    • 更新计时器刻度 如果一个完整的刻度已经过去,则计数。
    • 检查是否有定时定时器对象 已过期。

    计时器滴答是经过的概念 Windows 用来跟踪 一天中的时间和线程量子时间。 默认情况下,时钟中断和 计时器滴答声相同,但 Windows 或者应用程序可以更改时钟 中断期。

    默认计时器 Windows 7 上的分辨率为 15.6 毫秒 (ms)。 一些应用程序 将其减少到 1 毫秒,从而减少 移动系统上的电池运行时间 高达 25%。

    不过你可以试试这个:

    [DllImport("ntdll.dll", EntryPoint = "NtSetTimerResolution")]
    public static extern void NtSetTimerResolution(uint DesiredResolution, bool SetResolution, ref uint CurrentResolution);
    
    private void Foo()
    {
        uint DesiredResolution = 9000;
        bool SetResolution= true;
        uint CurrentResolution = 0;
    
        NtSetTimerResolution(DesiredResolution, SetResolution, ref CurrentResolution);
    }
    

    Source

    您也可以参考:High-Performance Timer in C#

    【讨论】:

    • 更好地使用记录在案的 API,例如 timeBeginPeriod。
    猜你喜欢
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多