C# GetLocalTime、Kernel32.dll和Windows7的准确度是多少?
我想得到最准确的1ms精度将是一天中非常好的时间。 我看到了这个使用GetLocalTime的示例:C# GetLocalTime、Kernel32.dll和Windows7的准确度是多少?,c#,datetime,C#,Datetime,我想得到最准确的1ms精度将是一天中非常好的时间。 我看到了这个使用GetLocalTime的示例: using System; using System.Runtime.InteropServices; [StructLayout(LayoutKind.Sequential)] public class SystemTime { public ushort year; public ushort month; public ushort weekday;
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();
}
}
准确度是多少?很可能是计时器的准确度。在较新版本的windows上,默认值为16毫秒,随着时间的推移,时间可以减少到1毫秒,这可能会增加计算机的功耗 我知道windows上的所有绝对时间函数都以计时器的精度工作。所以我希望它不会比DateTime好,也不会比DateTime差 相对时间函数StopWatch、QueryPerformanceCounter具有更高的精度,但没有提供有意义的绝对时间。它们还可能遇到跨多个CPU核的同步问题
但是为什么不测试一下呢:编写一个小程序读取时间,并在时间增加时打印出来。对DateTime.Now执行同样的操作。并进行比较。最有可能的是计时器精度。在较新版本的windows上,默认值为16毫秒,随着时间的推移,时间可以减少到1毫秒,这可能会增加计算机的功耗 我知道windows上的所有绝对时间函数都以计时器的精度工作。所以我希望它不会比DateTime好,也不会比DateTime差 相对时间函数StopWatch、QueryPerformanceCounter具有更高的精度,但没有提供有意义的绝对时间。它们还可能遇到跨多个CPU核的同步问题
但是为什么不测试一下呢:编写一个小程序读取时间,并在时间增加时打印出来。对DateTime.Now执行同样的操作。然后比较。为什么不使用DateTime.Now属性?它的精度不超过15分钟,您需要特殊的硬件才能获得如此精确的绝对时钟。通常基于GPS接收机。它仍然只对驱动程序有用,Windows并不是用户模式下的实时操作系统,线程量为45毫秒。标准时钟分辨率为1/64秒,因为使其更精确是毫无意义的。@HansPassant,如果在我当前的硬件中,我将按照CodeInChaos的回答执行timeBeginPeriod1?多媒体计时器是增量计时器,而不是绝对时钟计时器。而且它也不能使时钟更精确。而且它仍然受到内核线程抢占用户模式线程的影响。拉里·奥斯特曼(Larry Osterman):你为什么不使用DateTime.Now属性呢?它不精确到15分钟,你需要特殊的硬件来获得如此精确的绝对时钟。通常基于GPS接收机。它仍然只对驱动程序有用,Windows并不是用户模式下的实时操作系统,线程量为45毫秒。标准时钟分辨率为1/64秒,因为使其更精确是毫无意义的。@HansPassant,如果在我当前的硬件中,我将按照CodeInChaos的回答执行timeBeginPeriod1?多媒体计时器是增量计时器,而不是绝对时钟计时器。而且它也不能使时钟更精确。而且它仍然受到内核线程抢占用户模式线程的影响。拉里·奥斯特曼:谢谢。你能给我举个例子说明如何使用timeBeginPeriod将精确度降低到1ms吗?只需调用timeBeginPeriod1。但请注意,这具有全局效应,并影响所有应用程序中的计时器精度。谢谢。你能给我举个例子说明如何使用timeBeginPeriod将精确度降低到1ms吗?只需调用timeBeginPeriod1。但请注意,这具有全局效应,并影响所有应用程序中的计时器精度。