Как определить количество переключений контекста, которые произошли во время выполнения кода C #? - PullRequest
4 голосов
/ 01 октября 2008

Из C # можно ли определить количество переключений контекста, которые произошли при выполнении блока кода в определенном потоке? В идеале я хотел бы знать, сколько раз и на каком процессоре был запланирован мой код потока.

Я знаю, что могу использовать такие инструменты, как Event Tracing для Windows и связанные средства просмотра, но это оказалось немного сложным, чтобы получить данные, которые я хотел.

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

Справочная информация : я пытаюсь проверить фактическую производительность примитива низкоуровневой блокировки в .NET (в результате некоторых комментариев к недавнему посту в блоге , который я сделал.

Ответы [ 3 ]

3 голосов
/ 01 октября 2008

Звучит так, будто вы ищете программное решение, но если нет, то инструмент Microsoft Process Explorer очень легко подскажет количество переключений контекста для определенного потока.

Попав в инструмент, дважды щелкните по процессу, выберите вкладку «Потоки» и выберите свою тему.

На вкладке .NET есть более конкретные данные, связанные с .NET.

1 голос
/ 01 октября 2008

Я никогда не делал этого, но вот несколько подсказок, которые могут помочь:

  1. API профилировщика .NET могут позволить вам подключиться? Интерфейс ICorProfilerCallback имеет обратные вызовы RuntimeThreadSuspended и RuntimeThreadResumed. Но комментарий к этому сообщению в блоге , похоже, указывает на то, что они не дадут вам того, что вы ищете: «RuntimeThreadSuspended выдается, когда поток приостанавливается средой выполнения, обычно при подготовке к выполнению GC . "

  2. Может помочь счетчик пермонов «Переключение контекста / сек». Я не рассматривал этот счетчик специально, но я предполагаю, что он работает на потоках Win32, а не на управляемых потоках. Вы можете использовать API профилирования для получения идентификатора потока Win32 для любого заданного идентификатора управляемого потока.

Удачи! ;)

0 голосов
/ 02 октября 2008

Похоже, что procxp может использовать структуры данных потока ядра (KTHREAD) или исполнительного потока (ETHREAD), на которых имеется поле ContextSwitches. Это может быть возможно получить из управляемого кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...