Date: 27.08.2018 11:39:51
На всякий случай уточню: на вопрос "Как снизить эту цифру? " ответ - "Никак". Время переключения контекста потока является константой для данного процессора (ну или, по крайней мере для связки процессора и ОС).
Что касается влияния переключения контекста на производительность. Для того, чтобы понять это, нужно для начала понять, как многозадачные ОС управляют временем процессора. ОС выделяет каждому потоку по очереди интервал времени ("time slice"), в течение которого он должен выполнить свою работу. Переключение контекста происходит при одном из условий:
- По истечении этого интервала времени
- Запуске другого потока с более высоким приоритетом
- Запросе потоком ожидания
При обычном течении событий, когда все потоки работают с одинаковым приоритетом и не часто запрашивают ожидание, срабатывает только первое условие. Так как величина time slice (~20 мс) на несколько порядков больше времени переключения контекста (2-10 мкс), процент потерь на переключение контекста невелик.
Проблемы начинаются, когда проявляются 2 и 3 условия, например неисправное оборудование начинает слишком часто генерировать прерывания (которые выполняются с высоким приоритетом), либо в программе много циклов со Thread.Sleep(1), которые часто переводят поток в состояние ожидания. Тогда переключение потоков действительно может занимать большой процент процессорного времени. Само по себе количество потоков мало что значит, важно, что именно они делают.
Подробнее (по Windows) можете посмотреть здесь: https://docs.microsoft.com/ru-ru/windows/desktop/ProcThread/about-processes-and-threads и https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-2000-server/cc938613(v%3dtechnet.10)
Date: 28.08.2018 4:48:20
Автор: VadimTagil