(Отказ от ответственности: это не прямой ответ на вопрос, это всего лишь некоторые предложения, которые, я надеюсь, будут полезны).
Во-первых, числа, которые вы получаете, безусловно, звучат так, как будто они находятся на стадионе. Обратите внимание, однако, что задержка прерывания / прерывания может варьироваться лот среди разных моделей ЦП, реализующих один и тот же ISA. Это также другая история, если ваши потоки использовали операции с плавающей запятой или векторные, потому что если они не имеют, ядро избегает сохранения / восстановления состояния с плавающей запятой или векторного модуля.
Вы должны быть в состоянии получить более точные числа, используя инфраструктуру трассировки ядра - perf sched
, в частности, предназначено для измерения и анализа задержки планировщика.
Если ваша цель состоит в том, чтобы смоделировать серверы потоков на соединение, то вам, вероятно, не следует измерять задержку принудительного переключения контекста - обычно на таком сервере большинство переключений контекста будут произвольными, поскольку поток блокируется в read()
в ожидании дополнительных данных из сети. Следовательно, лучший тестовый стенд может включать измерение задержки от блокировки одного потока в read()
до другого, пробуждаемого из того же самого.
Обратите внимание, что на хорошо написанном сервере мультиплексирования под большой нагрузкой переход от fd X
к fd Y
часто будет включать в себя один и тот же системный вызов (так как сервер перебирает список дескрипторов активных файлов, возвращаемых из один epoll()
). Один поток также должен иметь меньшую площадь кеша, чем несколько потоков, просто благодаря наличию только одного стека. Я подозреваю, что единственный способ урегулирования вопроса (для некоторого определения "урегулирования") мог бы состоять в контрольной перестрелке ...