这个问题主要用于教育。我只是感兴趣为什么。我正在使用来自here的程序,但稍微修改了一下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
long ticks = DateTime.Now.Ticks;
while(true)
{
if (ticks != DateTime.Now.Ticks)
{
long newTicks = DateTime.Now.Ticks;
Console.WriteLine(newTicks - ticks);
ticks = newTicks;
}
else
{
Console.WriteLine("same");
}
}
}
}
}
结果:
600 $ Lenovo Edge 11,Intel Pentium U5400,Windows 7 Home Basic
same
same
same
same
same
same
same
10000
same
same
10000 $ HP DL360p Gen8 2 * Xeon E5-2640,Windows Server 2008 R2
same
same
same
same
same
same
same
156001
same
same
same
same
same
same
same
same
same
same
same
same
因此便宜笔记本上的DateTime精度为10毫秒,昂贵的服务器硬件精度为156毫秒。
为什么呢?我想可能Windows 7比Windows Server 2008 R2更“精确”,但这只是我的猜测。在两台计算机上安装了所有更新的最新.NET框架和所有Windows更新。
答案 0 :(得分:3)
首先,你算错了:
最小的时间单位是刻度,等于100纳秒。
因此10000个刻度仅为1毫秒,156001刻度为15.6毫秒。
这种差异不在硬件中。默认情况下,Windows大约每16ms运行一个内部计时器。此计时器负责窗口中的许多与计时相关的功能,包括计时器,Environment.TickCount
,Thread.Sleep
和DateTime.UtcNow
。
任何应用程序都可以使用timeBeginPeriod
API将其减少到选定的毫秒数(即最小1毫秒)。看起来您的笔记本上运行的应用程序要求更高的精度,但服务器上没有运行的应用程序。
默认情况下它不活动,因为它有一些负面的副作用。例如,当计算机空闲时功耗较高,因为它只能以1ms的间隔而不是16ms的间隔睡眠。
此功能会影响全局Windows设置。 Windows使用任何进程请求的最低值(即最高分辨率)。设置更高的分辨率可以提高等待功能中超时间隔的准确性。但是,它还可以降低整体系统性能,因为线程调度程序更频繁地切换任务。高分辨率还可以防止CPU电源管理系统进入省电模式。设置更高的分辨率并不会提高高分辨率性能计数器的准确性。
答案 1 :(得分:0)
您正在查看线程时间片的差异,如http://support.microsoft.com/kb/259025
中所述