我一直在高精度地使用时间来记录我的程序在控制台中的事件。但是很快我注意到程序有时显示的时间四舍五入到毫秒,有时却不显示!它是完全零星发生的,是相同的代码,不建议在运行之间进行编辑,而不是在运行之间进行编辑:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace DateTimePrecisionTest
{
class Program
{
static DateTime ProgramStartTimeGlobal;
static void PrintConsoleLogGlobal()
{
string TimeStampText = ((DateTime.Now - ProgramStartTimeGlobal).TotalMilliseconds / 1000).ToString("0.000000");
Console.WriteLine(String.Format("Global var: [ {0,10} ] ", TimeStampText));
}
static void PrintConsoleLogLocal(DateTime StartTime)
{
string TimeStampText = ((DateTime.Now - StartTime).TotalMilliseconds / 1000).ToString("0.000000");
Console.WriteLine(String.Format("Local var: [ {0,10} ] ", TimeStampText));
}
static void Main(string[] args)
{
ProgramStartTimeGlobal = DateTime.Now;
for (int i = 0; i < 20; i++)
{
PrintConsoleLogGlobal();
PrintConsoleLogLocal(ProgramStartTimeGlobal);
Thread.Sleep(512);
}
Console.ReadLine();
}
}
}
首先,我认为这取决于我要打印全局变量还是局部变量。但这似乎并非如此。输出为(值括号以秒为单位):
这种混乱的精度变化会在使用此日志记录的其他程序中发生。例如,该程序在远程服务器上执行任务(它们之间的延迟无法预料):
为什么??
在内部,DateTime.Now
(通过UtcNow
)取决于Windows API GetSystemTimeAsFileTime
。不幸的是,此时钟的分辨率可能会根据系统上其他程序的活动而变化(请参阅该页面底部的社区评论)。
该timeBeginPeriod
函数记录为:
此功能会影响Windows的全局设置。Windows使用任何进程请求的最低值(即最高分辨率)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句