Подтвердить что ты не робот

Что делает RtlInitializeExceptionChain, и как я могу уменьшить накладные расходы на выполнение?

Я пытаюсь найти узкие места в моей программе (в настоящее время на стадии "низкие висячие фрукты" ), и используя профилировщик, я получаю что-то вроде следующего:

Sleepy screenshot

То, что я вижу в этом, состоит в том, что RtlInitializeExceptionChain занимает значительное время, а функции из моей реальной программы даже не попадают в этот верхний список. Я хотел бы знать, знает ли кто, что делает RtlInitializeExceptionChain, как он называется, и как я могу реорганизовать свою программу, чтобы не называть ее так много?

Некоторая другая информация о моем проекте: это COM-API с использованием ATL, а профилированная программа - это "тестовая" программа на С++, которая использует этот API.

Спасибо!

4b9b3361

Ответ 1

RtlInitializeExceptionChain - это внутренняя функция в библиотеке времени выполнения, набор функций поддержки режима ядра, используемых драйверами режима ядра и самой ОС. Это своего рода версия в режиме ядра библиотеки времени выполнения C.

Если ваше приложение 32-разрядное и вы профилируете его на 64-битной машине, профилирование его на 32-разрядной машине или создание 64-разрядной версии, вероятно, приведет к перемещению RtlInitializeExceptionChain из списка 10 лучших, поскольку всегда используется в thunking.

В противном случае вы почти ничего не можете с этим поделать.

Ответ 2

Я нашел, что эта страница запускает ту же проблему, и я подумал, что должен добавить свое решение.

Я обнаружил приложение, страдающее сильным замедлением, которое я проследил до этой функции с помощью профилировщика.

Оказалось, что я оставил условную точку останова VS, на которой постоянно тестировалось, но не запускалось. Удаление точки останова устранило проблему.

Ответ 3

Насколько я знаю, RtlInitializeExceptionChain вызывается один раз для каждого потока, который создается, как часть его инициализации. Функция устанавливает SEH для потока.

Поскольку он выглядит дорогостоящим по времени (не уверен, почему, поскольку он, похоже, не очень много), убедитесь, что у вас много потоков в приложении, и потенциально можете увидеть, можно ли уменьшить количество потоков делая все возможное.

В любом случае, это функция, внутренняя для операционной системы, и это из прямого управления разработчиком, за исключением того, что он будет задействован в инициализации потоков, которые разработчик начал.

Ответ 4

Это может произойти в профилировщике Very Sleepy, если выбрать "Profile All" [Threads] вместо "Profile Selected" [Threads]. Там могут легко быть потоки, которые в основном ждут, и это смешивается с результатами профилирования. Я был брошен этим несколько раз.