【问题标题】:Is the System.Diagnostics.Stopwatch class normally slow when called repeatedly?System.Diagnostics.Stopwatch 类在重复调用时通常很慢吗?
【发布时间】:2012-02-16 20:51:42
【问题描述】:

我有一个应用程序,它必须以 33ms +/- 几毫秒的固定间隔传输数据包。

所以,我想出了一个SpinTimer 类,如下所示:

class SpinTimer
{
    public void SpinWait(double waitTimeInSeconds)
    {
        if (waitTimeInSeconds < 0.0)
        {
            throw new ArgumentOutOfRangeException("waitTimeInSeconds", "Must be >= 0.0");
        }

        Stopwatch timer = new Stopwatch();
        double elapsed = 0.0;
        timer.Start();
        do
        {
            elapsed = (double)timer.ElapsedTicks / (double)Stopwatch.Frequency;
        } while (elapsed < waitTimeInSeconds);
    }
}

但是,在分析代码后,我发现System.Diagnostics.Stopwatch.GetTimestamp() 调用占用了大部分执行时间。请注意,我不能让线程休眠和上下文切换,因为这会导致输出速率出现过多的“抖动”。

关于配置文件运行的注意事项:

  1. 线程优先级设置为ThreadPriority.Highest
  2. 进程优先级设置为ProcessPriorityClass.High

我编写的原始程序(在 C++ 中)使用 QueryPerformanceCounter()QueryPerformanceFrequency() 函数实现了相同的效果。我应该将这些调用与 PInvoke 一起使用而不是 Stopwatch 类吗?或者,还有其他合适的方法吗?

谢谢!

【问题讨论】:

  • 我对这个问题感到困惑。您正坐在一个紧密循环中,除了查询当前时间之外什么都不做。您的性能测试表明您将大部分执行时间用于查询当前时间,这不足为奇!
  • 我对它花费时间并不感到惊讶,但是需要多少时间......等效的 C++ 代码准确地等待(在频率规范内)所需的时间量。然而,当 SpinWait 执行而不是不执行时,C# 代码非常慢。

标签: c# performance timer stopwatch


【解决方案1】:

秒表位于诊断命名空间中。它不应该用于性能级别计时。

你可能想要一个计时器。

【讨论】:

    【解决方案2】:

    您是否尝试过使用 System.Windows.Threading.DispatcherTimer ?

    我用这个创建了几个程序,从来没有遇到任何延迟

    【讨论】:

      【解决方案3】:

      经过更多调试(受 Eric Lippert 评论的启发),我意识到我上面的代码完全符合要求。问题在于更高抽象级别的调用代码会导致等待时间过长。

      感谢使用System.Windows.Threading.DispatcherTimerSystem.Timers.Timer 的建议(我都投了赞成票);然而,在测试了每一个之后,它们的准确度被限制在 10 毫秒左右,这对于我的目的来说还不够好。但是,我确实发现我上面的“紧密”循环代码可以精确到约 1 微秒,这对于我目前的需求来说已经绰绰有余了。

      关于提高Stopwatch 准确性的this CodeProject 文章是其他人可能会发现有用的附加资源。主要思想是从根本上减少您的程序承受上下文切换的可能性,从而通过调度队列浪费时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-14
        • 1970-01-01
        • 1970-01-01
        • 2015-08-13
        • 1970-01-01
        • 1970-01-01
        • 2017-10-05
        • 2012-11-29
        相关资源
        最近更新 更多