2008-11-04 27 views
2

在紧密循环测试应用程序,打印出的DateTime.UtcNow.Ticks的价值,我注意到,该值将跳到一个显着的量一次每隔一小时左右。仔细查看以下示例数据:DateTime.UtcNow.Ticks有时跳到一个显着的量

1:52:14.312 PM - 633614215343125000 
1:52:14.359 PM - 633614215343593750 
1:52:14.421 PM - 633614215344218750 
1:52:14.468 PM - 633614215344687500 
1:52:14.515 PM - 633614215998593750 <-- WAY different 

增量为653906250刻度(65.390秒)。我能想出的唯一原因是Windows Time服务正在从我的脚下进行一些同步。

  • 有没有哪位专家能证实这一点?
  • 沙僧一分钟左右,大约一个小时似乎很对我不好,但在这里,是这样吗?
+0

你是如何记录左侧的时间?这似乎没有相同的跳跃,这很奇怪...... – 2008-11-04 20:15:27

+0

什么代码产生输出?已采取了哪些措施来确保呼叫之间的时间间隔一致?你在使用Thread.Sleep()吗? – 2008-11-04 20:16:50

回答

0

你可以发布代码,告诉你如何产生这个数据?并提供关于您正在运行的机器的详细信息?

使用下面的,我没有得到你做了什么。

 for (int i = 0; i < 10; i++) 
     { 

      Console.WriteLine(DateTime.Now.ToLongTimeString().ToString() + " - " + DateTime.UtcNow.Ticks.ToString()); 

      Thread.Sleep(10); 
     } 
+0

这个问题说,它只发生一个小时左右......你不可能在10次迭代所花费的时间内看到它! – 2008-11-04 20:26:12

2

其实,只是运行一些测试这一循环:

static DateTime past = DateTime.UtcNow; 
    static void PrintTime() 
    { 
     while (stopLoop == 0) 
     { 
      DateTime now = DateTime.UtcNow; 
      Console.WriteLine("{0} - {1} d: {2}", now, now.Ticks, now - past); 
      Program.past = now; 
      Thread.Sleep(2000); 
     } 
    } 

如果我改变了我的系统时钟的时间调用之间,增量将相应地跳。因此,如果您有时间同步运行或影响系统时间的某个其他进程,那么这将反映在输出中。

0

埃斯特班是正确的,系统时钟的变化会导致在连续的轮询之间增量时间的变化。 Windows时间服务是否每小时进行一次这些更改?可能在一个小时内漂移一分钟?

为了赶上这种情况发生你的机器上,如果你不停地跟踪增量在检查之间的变化,你可以在增量异常高的变化设置条件断点。

long delta = 0; 
long ticks = 0; 
long lastTicks = DateTime.UtcNow.Ticks; 
while (true) 
{ 
    ticks = DateTime.UtcNow.Ticks; 
    delta = ticks - lastTicks; 
    lastTicks = ticks; 
    // Conditional breakpoint: delta > 100000000 Is True 
    Console.WriteLine("{0} - {1}", ticks, delta); 
} 
0

原始输出在DebugView中被捕获。我的托管应用程序正在调用OutputDebugString调用,只需从线程中的紧密循环中输出DateTime.UtcNow.Ticks(也称为Thread.Sleep(1))。

 
System information for \\JLECOURSXP: 
Uptime:     6 days 6 hours 22 minutes 53 seconds 
Kernel version:   Microsoft Windows XP, Multiprocessor Free 
Product type:    Professional 
Product version:   5.1 
Service pack:    3 
Kernel build number:  2600 
Registered organization: 
Registered owner:   setup 
Install date:    6/15/2007, 3:35:29 PM 
IE version:    7.0000 
System root:    C:\WINDOWS 
Processors:    2 
Processor speed:   2.9 GHz 
Processor type:   Intel(R) Pentium(R) D CPU 
Physical memory:   3070 MB 
Video driver:    RADEON 9250 - Secondary 
1

埃姆...

如何测量时间这样,当你不能肯定地告诉你是不是在这个时候调用一些阻塞系统调用(像,可能Console.WriteLine) ?

为了有一个“工作试验”你必须至少确保:

  • 没有别的机器
  • 的进程/线程的优先级设置为高或类似的东西上运行那
  • 呼叫没有系统呼叫...只做computationl任务
  • 设置线程关联到一个特定的CPU,所以你不要让CPU之间切换

即使你会做的是,操作系统将不时(在Windows双核15毫秒核心桌面操作系统为例)抢占你的线程.... 你仍然可以看到UTC时间戳的那种“跳跃”。

从用户空间只是将内核空间(一个先发制人/系统调用中)和背部,没有做任何实质性的工作核心,将用时约1000个CPU周期...

如果处理被放入等待状态(通过调用一些阻塞IO),它甚至可能会更糟糕...

所以我真的不会得到你的“测试”。 IMO完全正常。

相关问题