2008-11-04 3 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

Esteban является правильным, изменение системных часов приведет к изменению дельта-времени между последовательными опросами. Служит ли служба времени 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. Мое управляемое приложение делало вызов p/invoke 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

Ehm ...

Как вы можете измерить время таким образом, когда вы не можете сказать наверняка, что вы не вызывая какой-то системы блокировки вызова в это время (как, потенциально Console.WriteLine) ?

Для того, чтобы иметь «рабочий тест» вы бы, по крайней мере, убедитесь, что:

  • НИЧЕГО больше не работает на вашей машине
  • Приоритет процесса/нить на высокий или что-то вроде что
  • Звонок без системного вызова ...Есть только computationl задачи
  • Set сродством нить к определенному CPU, так что вы не получите переключаться между процессорами

Даже если вы сделаете это, ОС будет время от времени (15ms на Windows, двух- Например, ОС настольного ПК) вытесняете свой поток ... И вы все же можете определенно увидеть такой «прыжок» в UTC Time-Stamp.

Просто происходит от Userspace до (во время ядра системы системного вызова преимущественной покупки /) и обратно, не делая какую-либо существенную работу ядра, потребуется ~ 1000 циклов CPU ...

Если вы обрабатываете помещаются в (вызвав некоторый блокирующий IO), он мог бы даже быть БОЛЬШЕ МНОГО хуже ...

Так что я действительно не получаю ваш «тест». ИМО это совершенно нормально.

Смежные вопросы