Подтвердить что ты не робот

Многопользовательский и многопользовательский .Net-секундомер?

Как мы все знаем, секундомер может иметь проблемы в многопоточном асинхронном приложении, которое будет работать на всех ядрах.

На многопроцессорном компьютере неважно, на каком процессоре работает поток. Однако из-за ошибок в BIOS или аппаратной абстракции (HAL) вы можете получать разные результаты синхронизации на разных процессорах. Чтобы указать сродство процессора к потоку, используйте метод ProcessThread.ProcessorAffinity.

Есть ли у меня какой-либо способ получить некоторые надежные метки/отметки времени, такие как значения, которые имеют высокое разрешение/точность, также согласованы между ядрами процессора?

Если невозможно сделать многожильный секундомер (QueryPerformanceCounter) безопасным, то какой лучший лучший способ получить хорошую временную метку по всем ядрам? DateTime.UtcNow.Ticks или Environment.TickCount? Любые другие счетчики?

Мне нужно лучшее разрешение, чем может предоставить DateTime.UtcNow.Ticks. (10-15ms)

4b9b3361

Ответ 1

Я сам искал ответ на эту конкретную проблему, и лучшее, что я видел, это DateTime.UtcNow. Казалось бы, нет открытого Windows с высоким разрешением и надежным счетчиком (я искал один раз в течение одного года и до сих пор не сталкивался с каким-либо).

Ответ 2

Собственно, согласно официальной документации после Windows XP, должно быть просто отлично использовать StopWatch/QueryPerformanceCounter на многопроцессорных системах. Если система не поддерживает инвариантный TSC, QPC автоматически использует другую стратегию таймера.

Обратите внимание на раздел комментариев, однако, для виртуализованных систем. Кажется, что вы должны быть осторожны в этом конкретном случае.