2012-07-21 12 views
-1

這個問題主要是針對教育。我只是感興趣爲什麼。我使用的程序從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聯想邊緣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毫秒,昂貴的服務器硬件的精度爲156毫秒。

爲什麼?我猜可能Windows 7比Windows Server 2008 R2更「精確」,但這只是我的猜測。在這兩臺計算機上最新的.NET框架與所有更新和所有的Windows更新安裝。

+0

有測量時鐘的準確性許多方面,這是不是他們 – 2012-07-21 18:38:53

+0

之一@parapurarajkumar這將是很好,如果你可以擴大該評論與鏈接或其他可能的解決方案。你可能會把它放入一個答案中,並阻礙一些觀點! – Prescott 2012-07-21 18:40:33

+1

http://blogs.msdn。com/b/ericlippert/archive/2010/04/08/precision-and-accuracy-of-datetime.aspx – 2012-07-21 18:43:36

回答

3

首先,你打錯了算盤:

時間的最小單位是蜱,它等於100納秒。

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


這種差異不在硬件中。默認情況下,窗口大約每16ms運行一個特定的內部定時器。該定時器負責窗口中的許多與時序相關的功能,包括定時器,Environment.TickCount,Thread.SleepDateTime.UtcNow

任何應用程序都可以使用timeBeginPeriod API將其減少到選定的毫秒數(即最少1ms)。看起來你的筆記本電腦上運行的應用程序要求更高的精度,但是沒有在你的服務器上運行的應用程序。

默認情況下它不是活動的,因爲它有一些負面的副作用。例如,計算機閒置時功耗較高,因爲它只能休眠1ms而不是間隔16ms。

此功能影響全局Windows設置。 Windows使用任何進程請求的最低值(即最高分辨率)。設置更高的分辨率可以提高等待功能中超時間隔的準確性。但是,它也會降低整體系統性能,因爲線程調度程序更頻繁地切換任務。高分辨率還可以防止CPU電源管理系統進入省電模式。設置較高的分辨率不會提高高分辨率性能計數器的精度。

+0

但是我的筆記本調整到1毫秒精度的可能性如何?我不記得那樣做。如何調整窗口有1毫秒的精度? – javapowered 2012-07-21 18:50:59

+0

任何在後臺運行的程序都可以調用該API。這不是一個永久設置,但取決於正在運行的應用程序請求。 – CodesInChaos 2012-07-21 18:53:29

相關問題