2012-02-20 26 views
0

我想要得到最準確的(1ms精度將是非常好的)時間。 我看到這個例子是使用GetLocalTime:GetLocalTime,Kernel32.dll,windows 7的準確性是什麼?

using System; 
using System.Runtime.InteropServices;  

[StructLayout(LayoutKind.Sequential)] 
public class SystemTime 
{ 
    public ushort year; 
    public ushort month; 
    public ushort weekday; 
    public ushort day; 
    public ushort hour; 
    public ushort minute; 
    public ushort second; 
    public ushort millisecond; 
} 

public class LibWrap 
{ 
    [DllImport("Kernel32.dll")] 
    public static extern void GetLocalTime([In, Out] SystemTime st); 
} 

public class App 
{ 
    public static void Main() 
    { 
     SystemTime st = new SystemTime(); 
     LibWrap.GetLocalTime(st); 
     Console.Write("{0}:{1}:{2}.{3}", st.hour, st.minute, st.second, st.millisecond); 
     Console.ReadKey(); 
    } 
} 

多少是準確的?

+0

爲什麼不使用'DateTime.Now'屬性? – 2012-02-20 20:24:09

+0

這是不準確的15ms – remi 2012-02-20 20:24:44

+0

你需要特殊的硬件來獲得準確的絕對時鐘。通常基於GPS接收器。它仍然只對驅動程序有用,Windows在用戶模式下並不完全是實時操作系統,線程量是45毫秒。標準時鍾分辨率是1/64秒,因爲使它更加準確是毫無意義的。 – 2012-02-20 20:37:14

回答

3

最有可能的計時器準確性。默認情況下爲16ms(在較新版本的Windows上),並且可以使用timeBeginPeriod(1)(可能會增加計算機的功耗)將其縮短爲1ms。

窗口上的所有「絕對時間」函數我知道在計時器精度下工作。所以我期望它不會比DateTime.Now更好或更差。

相對時間函數(StopWatch,QueryPerformanceCounter)具有較高的準確性,但不會給您有意義的絕對時間。他們也可能會遇到跨多個CPU核心的同步問題。

但爲什麼不測試它:編寫一個讀取時間的小程序,並在每次增加時打印。對DateTime.Now執行相同操作。並比較。

+0

謝謝。你能告訴我一個例子,如何用timeBeginPeriod將精度降低到1ms? – remi 2012-02-20 20:28:48

+0

只需調用'timeBeginPeriod(1)'。但請注意,這具有全局效應,並會影響所有應用程序中的定時器精度。 – CodesInChaos 2012-02-20 20:30:45

相關問題