Детализация даты и времени между 32-битной и 64-битной Windows

Я создал небольшое инженерное приложение для некоторой сетевой отладки. Он берет список 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");

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

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

РЕДАКТИРОВАТЬ:

Кажется, разница заключалась не в разнице 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;
    }
6
задан Community 23 May 2017 в 12:24
поделиться