Оптимизация производительности при ходьбе по стеку - PullRequest
4 голосов
/ 07 декабря 2011

В настоящее время я использую библиотеку dbghelp , чтобы пройти по стеку потока какого-то процесса (используя GetThreadContext () и StackWalk64 () ) и собирать толькоадреса возврата, содержащиеся в каждом кадре.

Тем не менее, накладные расходы слишком велики для требований системы - общее время составляет apx.5 мсек на стековую прогулку (с 10-15 кадрами).На этот раз включает GetThreadContext () и цикл, который вызывает StackWalk64 (), чтобы получить все кадры.

В любом случае, я должен найти способ сделать это намного быстрее.У кого-нибудь есть идеи, как мне это сделать?


Редактировать:

Кто-нибудь знает механизм ETW (Event Tracing for Windows)?

Если так, как я могу отследить все переключения контекста, которые произошли в определенный период времени?Есть ли поставщик событий, который публикует событие при каждом переключении контекста?

Ответы [ 3 ]

3 голосов
/ 07 декабря 2011

Самый быстрый способ, который я могу придумать, - это создать собственную версию GetThreadContext и StackWalk64, создав драйвер ядра, который захватывает поле kernelStack структуры ETHREAD потока, который вы пытаетесь отслеживать. Здесь хорошая статья на эту тему.

2 голосов
/ 20 января 2012

Если вы работаете в Windows Vista или выше, вам следует использовать ETW, точка.Вы можете активировать все, о чем вы говорите, включая переключение контекста и события Sample Profile, и это довольно эффективно.Для X86 это, в основном, обход цепочки регистров EBP, представляющей собой связанный список адресов, по которым он должен перебираться.В 64-битной среде стекопреобразователь должен разматывать стек, поэтому он немного менее эффективен, но я могу сказать, что если вы выполняете какую-либо разумную работу в своем приложении, эффекты обхода стека не будут проявлятьсявверх.Это, конечно, не в миллисекундном диапазоне.

1 голос
/ 07 декабря 2011

Часть ETW на самом деле является независимым вопросом. Инструменты анализа производительности Windows могут захватывать все переключатели контекста, а также Visual Studio Profiler в режиме «Профилирование параллелизма конфликтов ресурсов».Вы также можете выгрузить все события в файл вручную, используя logman, см. Инструкции здесь .

...