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