为什么昂贵的服务器比最便宜的上网本更糟糕的DateTime精度?

时间:2012-07-21 18:36:55

标签: c# datetime

这个问题主要用于教育。我只是感兴趣为什么。我正在使用来自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更新。

2 个答案:

答案 0 :(得分:3)

首先,你算错了:

  

最小的时间单位是刻度,等于100纳秒。

因此10000个刻度仅为1毫秒,156001刻度为15.6毫秒。


这种差异不在硬件中。默认情况下,Windows大约每16ms运行一个内部计时器。此计时器负责窗口中的许多与计时相关的功能,包括计时器,Environment.TickCountThread.SleepDateTime.UtcNow

任何应用程序都可以使用timeBeginPeriod API将其减少到选定的毫秒数(即最小1毫秒)。看起来您的笔记本上运行的应用程序要求更高的精度,但服务器上没有运行的应用程序。

默认情况下它不活动,因为它有一些负面的副作用。例如,当计算机空闲时功耗较高,因为它只能以1ms的间隔而不是16ms的间隔睡眠。

  

此功能会影响全局Windows设置。 Windows使用任何进程请求的最低值(即最高分辨率)。设置更高的分辨率可以提高等待功能中超时间隔的准确性。但是,它还可以降低整体系统性能,因为线程调度程序更频繁地切换任务。高分辨率还可以防止CPU电源管理系统进入省电模式。设置更高的分辨率并不会提高高分辨率性能计数器的准确性。

答案 1 :(得分:0)

您正在查看线程时间片的差异,如http://support.microsoft.com/kb/259025

中所述