Детализация даты и времени между 32-битной и 64-битной Windows - PullRequest
6 голосов
/ 20 октября 2011

Я создал небольшое инженерное приложение для отладки сети. Он берет список IP-адресов и пингует их с заданным пользователем временем ожидания и скоростью. Он регистрирует среднее время приема-передачи и каждый раз, когда один из отправителей терпит неудачу, регистрирует его продолжительность сбоя и отметку времени, когда это произошло ...

Это идея. Я разработал его на компьютере с Win7 с .Net4, и мне пришлось поставить его на набор ноутбуков с XP.

Проблема в том, что значения длительности на моем ящике во время тестирования показывают хорошие длительности в мс, на окнах XP, когда я смотрю, они показывают 0 или 15,625 (магическое число?) ... и имеют забавный квадрат, символ коробки в строке

    public void LinkUp()
    {
        if (_isLinkUp) return;

        _upTime = DateTime.Now;
        var span = _upTime.Subtract(_downTime);
        _downTimeLog.Add(new LinkDown()
                            {
                                _span = span,
                                _status = _ipStatus,
                                _time = _downTime
                            });
        _isLinkUp = true;
    }

Это бит, который делает журнал. _IpStatus является причиной сбоя проверки связи (обычно тайм-аут).

    _downEventLog.AppendLine("  Duration-> " + linkDownLogEvent._span.TotalMilliseconds + "ms\n");

Это та часть, которую печатает ... Кто-нибудь может пролить свет на эту очевидную разницу?

На вопрос был дан ответ, но я включу правку здесь для получения дополнительной информации.

EDIT:

Кажется, что разница была не в разнице между Win7 и WinXP, а в 32 и 64 битах.

В 32-битных системах Windows, как указывает Хенк , степень детализации системных часов составляет 15-16 мс, это то, что дало мне значение 15,625 для каждого значения меньше 16 мс для временного интервала.

В 64-битной системе системный вызов относится к другому набору методов, которые имеют более тонкую гранулярность. Итак, на моем компьютере разработчика в x64 у меня была мс точность от системных часов!

Теперь, секундомер использует аппаратный интерфейс через инструментальные средства процессора, чтобы записывать гораздо более тонкую детализацию (вероятно, не каждый такт процессора, но я представляю что-то неприлично точное в соответствии с этим мышлением). Если аппаратное обеспечение, лежащее в основе ОС, не имеет этого уровня инструментария, оно будет использовать системное время. Так что будьте осторожны! Но я бы предположил, что большинство современных настольных компьютеров / ноутбуков имеют такой инструментарий ... Встраиваемые устройства или подобные вещи могут отсутствовать, но тогда класс секундомера не находится в Compact Framework, насколько я могу видеть (здесь вы должны использовать QueryPerformanceCounter ( )).

Надеюсь, все это поможет. Это мне очень помогло.

Где-то около инициализатора _spanStopWatch:

    if (!_spanStopWatch.IsHighResolution)
    {
        throw new ThisMachineIsNotAccurateEnoughForMyLikingException("Find a better machine.");
    }

Гайки и болты:

    public void LinkUp()
    {
        if (_isLinkUp) return;

        _spanStopWatch.Stop();
        var span = _spanStopWatch.Elapsed;
        _downTimeLog.Add(new LinkDown()
                            {
                                _span = span,
                                _status = _ipStatus,
                                _time = _downTime
                            });
        _isLinkUp = true;
    }

1 Ответ

5 голосов
/ 20 октября 2011

0 или 15,625 (магическое число?)

Да, использование DateTime.Now точно только для длины временного интервала ЦП, 15-20 мс в зависимости от вашего оборудования и версии ОС.

Используйте System.Diagnostics.Stopwatch для более точной синхронизации.

...