ManualResetEventSlim рекомендуемое время ожидания

Документация MSDN для ManualResetEventSlim указывает

Вы можете использовать этот класс для лучшей производительности, чем ManualResetEvent, когда ожидаемое время ожидания будет очень коротким.

Как долго "очень короткий"? В какой момент преимущество использования объекта ядра с ManualResetEvent перевешивает накладные расходы на его создание?

Ответы

Ответ 1

Это то, что я нашел и хотел бы, чтобы кто-то еще подтвердил это, но это то, что я нашел при чтении Reference Source для ManualResetEventSlim

ManualResetEventSlim
Он пытается просто спать и уступать по количеству процессоров и делать крайне короткие спячки - 1 мс или 0 мс в зависимости от его текущего индекса спина. Если до сих пор не хватило времени, оно вернется к использованию Monitor.Wait с использованием новой обновленной версии таймаута, которая была первоначально передана.

Передача в 0 для Thread.Sleep уменьшает время.

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

Мой вывод
" Очень короткий" означает всего несколько миллисекунд.

EDIT: Я только что нашел те, у которых много информации:

Ответ 2

Шкала от кэша CPU к ОЗУ и к ядру приблизительно логарифмическая. Скажем, вы можете делать 400 циклов с использованием кеша ЦП или 20 циклов ЦП, используя чтение/запись ОЗУ или 1 операцию ядра. Числа будут зависеть от аппаратного обеспечения, это просто оценка.

Если вы считаете, что максимальное время ожидания будет меньше 6-15 нс (~ 20-50 циклов процессора @3GHz), чем небольшое время ожидания.