Загрузка CPU/IO драйверов измерительных устройств, вызванная моей программой
Иногда код может использовать драйверы устройств вплоть до момента, когда система не отвечает.
В последнее время я оптимизировал код WIN32/VC++, что делало систему почти не отвечающей. Использование ЦП, однако, было очень низким. Причиной были тысячи созданий и разрушений объектов GDI (ручки, кисти и т. Д.). Как только я реорганизовал код для создания всех объектов только один раз - система снова стала отзывчивой.
Это приводит меня к вопросу: существует ли способ измерить использование CPU / IO драйверов устройств (GPU/ диск / и т. Д.) Для данной программы / функции / строки кода?
3 ответа
Вы можете использовать различные инструменты из SysInternals Utilities (сейчас это продукт Microsoft, см. http://technet.microsoft.com/en-us/sysinternals/bb545027), чтобы дать основную идею, прежде чем приступить к работе. В вашем случае проводник процессов (procxp) а монитор процессов (procmon) выполняет достойную работу. Они могут быть использованы для того, чтобы дать вам базовое представление о том, какой тип медлительности, прежде чем приступить к детализации профилирования.
Затем вы можете использовать xperf http://msdn.microsoft.com/en-us/performance/default для детализации. При правильной настройке этот инструмент может привести вас к точной функции, которая вызывает медлительность, без внедрения кода профилирования в вашу существующую программу. Уже есть видео PDC, рассказывающее о том, как его использовать http://www.microsoftpdc.com/2009/CL16 и я настоятельно рекомендую этот инструмент. Исходя из моего собственного опыта, всегда лучше сначала наблюдать за использованием procxp/procmon, а затем ориентироваться на подозреваемых с помощью xperf, потому что xperf может генерировать огромную загрузку информации, если она не отфильтрована разумным способом.
В некоторых сложных случаях, связанных с блокировками, инструменты отладки для Windows (windbg) будут очень полезны, и есть специальные книги, рассказывающие об их использовании. В этих книгах обычно говорится об обнаружении зависания, и здесь можно использовать несколько методов для определения медлительности. (например, беглец)
Может быть, вы могли бы использовать ETW для этого? Не уверен, что это поможет вам понять, что именно является причиной, но должно дать вам общее представление о том, как работает ваше приложение.
Чтобы узнать, сколько процессора / памяти / диска используется программой в режиме реального времени, вы можете использовать программы мониторинга ресурсов и диспетчера задач, которые поставляются с Windows. Вы можете узнать количество времени, которое блок кода занимает относительно других блоков кода, распечатав systime. Не забывайте не делать слишком много мониторинга сразу, потому что это может сойти с ваших вычислений.
Если вы знаете, сколько процессорного времени занимает программа и какой процент времени занимает блок кода, вы можете приблизительно оценить, сколько процессорного времени занимает блок кода.