【发布时间】: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() 调用占用了大部分执行时间。请注意,我不能让线程休眠和上下文切换,因为这会导致输出速率出现过多的“抖动”。
关于配置文件运行的注意事项:
- 线程优先级设置为
ThreadPriority.Highest - 进程优先级设置为
ProcessPriorityClass.High
我编写的原始程序(在 C++ 中)使用 QueryPerformanceCounter() 和 QueryPerformanceFrequency() 函数实现了相同的效果。我应该将这些调用与 PInvoke 一起使用而不是 Stopwatch 类吗?或者,还有其他合适的方法吗?
谢谢!
【问题讨论】:
-
我对这个问题感到困惑。您正坐在一个紧密循环中,除了查询当前时间之外什么都不做。您的性能测试表明您将大部分执行时间用于查询当前时间,这不足为奇!
-
我对它花费时间并不感到惊讶,但是需要多少时间......等效的 C++ 代码准确地等待(在频率规范内)所需的时间量。然而,当
SpinWait执行而不是不执行时,C# 代码非常慢。
标签: c# performance timer stopwatch