我尝试实现.NET Stopwatch
很有趣,但是却得到了一些意外的结果。
我完全期望该程序的执行时间约为100毫秒。Stopwatch
类是否不正确?或者这是怎么回事?
码:
namespace Timer
{
class Program
{
Stopwatch s = new Stopwatch();
static void Main(string[] args)
{
s.Start();
for (int i = 0; i < 100; i++)
{
Thread.Sleep(1);
}
s.Stop();
Console.WriteLine("Elapsed Time " + s.ElapsedMilliseconds + " ms");
Console.ReadKey();
}
}
}
结果是
190 ms
最佳答案
因为Thread.Sleep(n)
表示:至少n个毫秒。
前段时间I wrote an answer(尽管在另一个主题上),其中包含an external reference:
Thread.Sleep(n)
表示至少阻止当前线程数
n
中可能出现的时间片(或线程量子)的数量
毫秒。
时间片的长度在不同的版本/类型上有所不同
Windows和不同的处理器,通常为15到30
毫秒。这意味着线程几乎可以保证为
超过n
毫秒。您的线程将出现的可能性
精确地在n
毫秒后重新唤醒几乎是不可能的
不可能是可以的。因此,Thread.Sleep
对于计时没有意义。
根据MSDN:
系统时钟以称为时钟分辨率的特定速率计时。
实际超时可能不完全是指定的超时,因为
指定的超时将调整为与时钟滴答一致。
关于c# - 如果使用Thread.Sleep进行检查,为什么秒表似乎不准确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28279188/