2012-02-14 3 views
13

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

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

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

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

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

ответ

7

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

+0

образец код использования? –

5

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

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

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