-1

这个问题主要是针对教育的。我只是为什么感兴趣。我正在使用此处的程序,但对其进行了一些修改:

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 美元联想 Edge 11、英特尔奔腾 U5400、Windows 7 家庭基础版

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 ms,昂贵的服务器硬件精度为 156 ms。

为什么?我猜可能 Windows 7 比 Windows Server 2008 R2 更“精确”,但这只是我的猜测。在两台计算机上都安装了最新的 .NET 框架,所有更新和所有 Windows 更新都已安装。

4

2 回答 2

3

首先,你算错了:

最小的时间单位是滴答声,等于 100 纳秒。

所以 10000 个刻度只是 1ms,156001 个刻度是 15.6ms。


这种差异不在于硬件。默认情况下,windows 大约每 16 毫秒运行一个特定的内部计时器。这个计时器负责windows中许多与计时相关的功能,包括计时器Environment.TickCount、.Thread.SleepDateTime.UtcNow

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

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

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

于 2012-07-21T18:41:58.083 回答
0

如http://support.microsoft.com/kb/259025中所述,您会看到线程时间片的差异

于 2012-07-21T18:45:58.910 回答