Многоядерный и многопоточный .Net секундомер? - PullRequest
14 голосов
/ 14 февраля 2012

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

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

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

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

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

Ответы [ 2 ]

7 голосов
/ 30 августа 2012

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

5 голосов
/ 22 июня 2015

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

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

...