| Профилировщики программ Си++ |
|
|
| Автор Westry | ||||||||||||||||||
| 16.02.2008 г. | ||||||||||||||||||
|
При разработке Windows-программ часто приходится идти на многочисленные компромиссы при увязке противоречивых требований, например, таких как реализация множества функций без ущерба для быстродействия. По мере усложнения программы, увеличения ее размера и расширения функциональных возможностей скорость ее выполнения неизбежно снижается. А поскольку это один из основных факторов, по которому конечные пользователи судят о программе, низкое быстродействие может обесценить даже программы с богатым набором наиболее передовых и развитых функций.
Невысокое быстродействие - это изначальная проблема Windows-программ. Сложный графический интерфейс требует обработки множества команд ОС даже при простом выводе на экран единственного символа. Разработчики видеоадаптеров быстро отреагировали на низкое быстродействие графической подсистемы и создали акселераторы, подменяющие многочисленные команды ОС обработкой на аппаратном уровне. К сожалению, подобных аппаратных ускорителей для прикладных программ нет. Поэтому разработчики сталкиваются с мучительной необходимостью анализа каждой строки исходного текста для выявления неэффективных фрагментов. Этот титанический труд часто усложняется тем, что такие места бывает трудно выявить. Например, сама функция работает быстро; но обращения к ней настолько многочисленны, что приводят к замедлению работы; однако это выясняется лишь после длительной работы программы. Задача такого поиска может оказаться непосильной или, в лучшем случае, слишком продолжительной по времени. Сказанное особенно характерно для крупных проектов с тысячами строк исходного текста. Новейшие тенденции в создании программных систем на базе заранее подготовленных модулей и компонентов еще более затрудняют отыскание неэффективных мест в программе. Исполнимый файл типичной Windows-программы содержит элементы из самых разных источников. Например, в программе для общения с Сетью могут использоваться управляющие элементы ActiveX, драйверы доступа к базам данных средствами Open Database Connectivity (ODBC), DLL-модули независимых фирм. Кроме того, очень вероятно, что такое приложение построено на основе готовой инфраструктуры разработки прикладных программ, например библиотеки Microsoft Foundation Classes (MFC). К счастью, в помощь измученным разработчикам Windows-приложений предлагается следующее средство: пакеты построения и анализа профилей эффективности кода - профилировщики (code profilers). С помощью этих мощных средств можно выявить и устранить проблемы с быстродействием в новых программах. Они позволяют выяснить, как расходуется время при работе того или иного модуля. Анализируется ход его выполнения, и по результатам выявляются участки неэффективной работы (или, наоборот, эффективной). Можно даже учесть, когда неэффективен действительно сам код, а когда работа замедлена чрезмерно частыми к нему обращениями. Определив число обращений к каждому фрагменту, профилировщик может выделить те из них, которые после их оптимизации обеспечат наиболее существенный прирост в быстродействии. Как выполняется построение и анализ профиля?Профилировщики собирают подробную информацию о каждой функции в процессе выполнения тестируемой программы. Их цель - подготовить исчерпывающий отчет о быстродействии исполнимого кода, отражающий затраты времени на обработку конкретных функций и число обращений к ним. В каждом профилировщике используется свой способ получения информации, однако, как правило, любой из них может быть отнесен к одной или нескольким следующим категориям:
Для выявления неэффективно работающих функций необходимо уметь различать два случая: когда время затрачивается на обработку только собственных операций и когда - на выполнение вызываемых из программы внешних (порожденных) обращений к функциям. Как правило, в большинстве профилировщиков, эта задача решается, хотя и с разной степенью детализации. В более развитых пакетах удается определить время, затраченное на порожденные вызовы, и выяснить долю каждой из них. В идеальном случае вы должны иметь возможность посмотреть текст функции, найти наихудшую по эффективности "порожденную" функцию и произвести ее анализ для выяснения причин. Обратите внимание, что построение профиля программы - процесс итеративный, то есть повторяемый многократно. Хороший профилировщик позволяет вам быстро обработать тестируемую программу, провести анализ результатов для выявления подозрительных мест, внести исправления в исходный текст и повторить все заново. Учитывая итеративный характер вычислений, профилировщик должен работать быстро, быть интуитивно понятным и иметь полный набор услуг. Другими словами, время, затрачиваемое на его работу, должно быть минимальным.
Microsoft Corp. Microsoft Visual C++ Professional Edition Пакет Microsoft Visual C++ 5.0 (версии Professional и Enterprise) содержит фирменную программу построения и анализа профиля эффективности кода. В нем используется принцип выборки по времени, описанный выше. Возможность непосредственного отслеживания быстродействия внешних модулей не предусматривается. Подготовить проект к построению профиля довольно просто. Сначала вы выбираете в меню команду Project|Settings (Проект|Параметры) и открываете закладку Linker (Редактор связей). Затем выбираете опции Enable Profiling (Получить профиль эффективности) и нажимаете OK для сохранения значений параметров. Учтите, что необходимо повторить компоновку программы, чтобы все изменения нашли отражение в проекте. После повторной компоновки вашей программы можно приступать к анализу проекта, выбрав в меню Build команду Profile. Появляется диалоговое окно параметров анализа, где предлагается несколько вариантов: Function Timing (Статистика времени обработки функций), Function Coverage (Используемые функции) и Line Coverage (Используемые строки исходного текста). При выборе Function Timing для каждой функции определяется время исполнения как для нее самой, так и для порожденных ею функций. При выборе Function Coverage выдается список всех функций с пометками об их использовании; а при выборе Line Coverage - такой же список для всех строк исходного текста. Последние два варианта можно объединить в более общую группу - использование кода, что поможет выявить участки, никогда не задействованные в работе. В этой статье мы рассмотрим вопросы быстродействия. Профилировщик Visual C++ - сравнительно простой инструмент, великолепно вписывающийся в интегрированную среду разработки (ИСР) проектов Visual C++. Все получаемые результаты отображаются в окне вывода. Подробный отчет содержит ряд основных сведений о времени исполнения функции и общую информацию о времени обработки самой функции и о суммарных затратах времени на исполнение порожденных ею обращений к другим функциям. Учитывая особенности технологии выборки по времени, при разных запусках программы получаются несколько отличающиеся результаты. Также оказывает влияние одновременная обработка других программ в системе. Степень детализации данных в отчете профилировщика, возможно, будет достаточна для простых программ. Но в нем нет подробных сведений о распределении времени между родительскими и порожденными функциями, помогающих при выявлении проблем с быстродействием в более сложных приложениях. Например, даются лишь суммарные затраты времени на обработку всех "порожденных" функций вместо конкретных значений для каждой из них. Поэтому трудно, например, определить, какая из десяти функций, работает неэффективно. Решение такой задачи еще больше усложняется тем обстоятельством, что профилировщик Visual C++ обрабатывает лишь код текущей программы. Поэтому, если одна из функций находится в DLL-модуле, то в отчете не будет подробных сведений о ней. Профилировщик Visual C++, возможно, будет полезен при разработке сравнительно простых программ без сложных рекурсивных вызовов порождаемых вызовов или внешних модулей. Его достоинства - тесная интеграция с ИСР Visual C++, а также тот факт, что он входит в комплект поставки пакета Visual C++. Microsoft Visual C++ Professional Edition. TracePoint Technology Inc. HiProf Пакет HiProf 1.01 - это первый из серии продуктов фирмы TracePoint Technology, недавно отделившейся от компании Digital Equipment Corp. В нем используется фирменная технология под названием Binary Code Instrumentation - некоторая разновидность рассмотренной ранее схемы вставки служебных инструкций в двоичном коде. HiProf выполняет анализ команд и символических ссылок в EXE-файле вашей программы и создает собственный вариант исполнимого файла со вставленными инструкциями. Это обеспечивает проведение анализа в реальном режиме времени с выдачей результатов в текстовой и графической формах. При подготовке программы для построения и анализа профиля требуется только скомпоновать ее в отладочном варианте (debug). Загрузите ИСР HiProf, создайте новый проект и укажите, где находится исполнимый файл программы. Выберите в меню Application (Программа) команду Instrument & Run (Подготовить и загрузить). HiProf произведет вставку служебных инструкций, загрузит на исполнение EXE-файл и выдаст сведения о его реальном быстродействии. Операция вставки инструкций для программ среднего или большого объема может затянуться на несколько минут, в зависимости от используемого процессора и доступной оперативной памяти. После окончания работы с подготовленной описанным выше способом программой профилировщик HiProf генерирует отчет, содержащий детальный список временных затрат для всех компонентов программы, отдельно для каждого потока. При выборе конкретного потока в окне Thread List (Список потоков) появляются два новых окна: Function List (Список функций) и Hierarchical View (Иерархический анализ). В окне Function List дается суммарное время на обработку каждой функции с учетом или без учета обращений к порожденным функциям. Кроме этого, для любой из них указывается число обращений к ней и название исходного файла, содержащего эту функцию. Вместе с Function List используется окно Source View (Исходный текст). Вы можете выбрать конкретную функцию и для каждой строки ее исходного текста получить подробную информацию о затраченном на обработку данной команды времени. В окне Source View имеется пять столбцов: номер строки, относительное (в процентах) и абсолютное время обработки непосредственно в самой функции, число имевшихся обращений и исходный текст этой строки. Все пять значений выводятся для любой строки функции. Используя эти данные, можно оценить скорость выполнения любой команды этой функции. В окне Hierarchical View системы HiProf дается графическая интерпретация параметров быстродействия функции с учетом ее родительских/порожденных вызовов. При выборе в списке одной из функций в окне Hierarchical View выводится подробная информация по каждой обращавшейся к ней (родитель) и вызывавшейся из нее (потомок) функции. Подобная степень детализации полезна для выявления низкого быстродействия при нескольких уровнях вложенности вызовов порождаемых функций. В HiProf также имеется ряд параметров настройки, позволяющих отобрать участки программы, которые будут учитываться при анализе или, наоборот, будут проигнорированы. Можно добавить анализ внешних подключаемых к вашей программе модулей. Дополнительная функция позволяет поэтапно выполнять программу в интерактивном режиме, оцененивая быстродействие на каждом этапе. HiProf - это добротный пакет, полностью готовый для активного использования. Его функция Hierarchical View выдает полезную информацию для выявления проблем с быстродействием при разработке сложных прикладных программ с несколькими уровнями вложенности вызовов функций. Выводимая в окне Source View информация удобна для анализа функций с недостаточным быстродействием; она позволяет построчно оценить исходный текст. Кроме того, в HiProf предусмотрена частичная интеграция в ИСР Visual C++, которая ограничивается введением лишь нескольких кнопок на панели инструментов. HiProf 1.01. Pure Atria Corp. Visual Quantify Visual Quantify фирмы Pure Atria Corp. - мощный пакет для анализа профилей программ Си++, осуществляемого по фирменной методике, названной Object Code Insertion (вставка инструкций в объектный код). В сущности, это - некоторая разновидность рассмотренной ранее технологии ввода инструкций в двоичном коде. Наше тестирование проводилось на версии Beta 2, где также предусматривается анализ профиля для Java-программ с помощью мониторинга в реальном режиме времени, который обеспечивает хронометраж обработки каждого байт-кода виртуальной машиной Java фирмы Microsoft. В Visual Quantify также предусмотрен анализ эффективности внешних компонентов, таких как управляющие элементы ActiveX и DLL-модули. Для построения и анализа профиля нужно выбрать в меню ИСР Visual Quantify команду File|Run (Файл|Исполнить) и указать имя нужного EXE-файла. Visual Quantify загрузит его и создаст собственную версию со вставленными служебными инструкциями. В Visual Quantify, как и в HiProf, процесс введения инструкций может продолжаться достаточно долго. После его окончания программа автоматически запускается на исполнение. Когда программа завершена, в главном окне Visual Quantify появляются данные о быстродействии. В окне Run Summary (Сводка исполняемых программ), которому отводится центральная роль в показе детализированных результатов, отображаются данные о работе конкретных потоков программы, ОС и аппаратных средств, применявшихся при тестировании. Также дается список всех оснащенных средствами контроля модулей с указанием способа введения этих средств. Еще один инструмент пакета Visual Quantify - окно Call Graph (Диаграмма обращений). Здесь в графической форме представлена последовательность обработки в вашей программе. Этот график позволяет выявить участки наиболее длительных вычислений, и благодаря такой глобальной оценке удается легко локализовать разделы, которые потенциально могут ухудшить быстродействие. Возможны многочисленные варианты вывода данных в окне Call Graph, (например, просмотр десяти наиболее продолжительных функций). В окне Function List (Список функций) даются такие подробные сведения о каждой функции, как число обращений к ней, время исполнения без учета порожденных функций и с их учетом. При выборе в окне Call Graph конкретной функции появляется окно Function Detail (Сведения по функции). Оно содержит три раздела: в первом дается информация, аналогичная показанной в окне Function List; во втором и третьем - списки, соответственно, родительских и порожденных функций для текущей функции. Выбирая любую из них, можно перемещаться вверх/вниз по цепочке вызовов программы. Степень детализации информации в окне Function Detail, как правило, достаточна для выявления неудовлетворительно работающих порожденных функций. Однако предлагаемая схема навигации неудобна. Функция PowerTune (Дополнительные параметры) позволяет настроить конфигурацию проведения анализа. Например, можно указать, для каких функций следует создавать профиль, или выбрать нужный режим регистрации данных - при переходе на новую строку в исходном тексте, при переходе на новую функцию или через определенные промежутки времени. По умолчанию, Visual Quantify собирает данные для всей программы, включая все ее компоненты. С помощью функции PowerTune можно сузить список анализируемых компонентов, чтобы сосредоточить внимание на потенциально неблагополучных участках программы. Это не только уменьшит объем генерируемой информации, но и сократит время на подстановку служебных инструкций. Однако наряду с указанными достоинствами пакет Visual Quantify имеет одно существенное ограничение: это - единственный среди представленных в обзоре продуктов, не совместимый с Windows 95. Хотя, вероятно, многие корпоративные разработки для Windows ведутся на базе Windows NT, отсутствие Windows 95 в списке допустимых платформ станет преградой при решении проблем эффективности, проявляющихся только в этой операционной системе. Итак, по данным, представленным в окне Call Graph пакета Visual Quantify, можно сразу же оценить взаимосвязи между всеми функциями программы и выявить цепочки вызовов, наиболее длительные по времени. Однако объем информации об иерархии вызовов, приводимый в детальном описании конкретной функции, меньше, чем в HiProf. Выбранный способ навигации с помощью окон Call Craph и Function Detail неудобен. Если вы разрабатываете программы для Windows 95, то пакет Visual Quantify вам не подойдет. Visual Quantify. Intel Corp. VTune Пакет VTune фирмы Intel Corp. широко рекламируется ею как исчерпывающая "визуальная среда доводки программ" для платформы Windows. В основе работы пакета лежит совместное использование технологий вставки служебных инструкций в двоичном коде и выборки по времени. Это позволяет многопланово оценивать эффективность программы и элементов операционной среды Windows, в том числе драйверов устройств и системных DLL-модулей. В коммерческой версии 2.4 будет также предусмотрена возможность построения и анализа профилей Java-программ (в тестировании использовалась предварительная версия пакета, не имевшая этой возможности). Подготовка вашего проекта для программы VTune во многом такая же, как для других профилировщиков. Сначала производится компоновка отладочной версии EXE-модуля и загружается ИСР VTune. Появляется рабочее окно "мастера", где предлагается подготовить новый проект или загрузить готовый. При создании нового проекта нужно указать имя EXE-файла и некоторую дополнительную информацию. После подготовки проекта вы приступаете к построению профиля, выбирая в меню Run (Выполнить) команду Start Monitor Session (Начать сеанс мониторинга). VTune выводит окно VTune Assistant, напоминающее карточки примеров; это позволяет руководить действиями пользователя на всех этапах данного процесса. После окончания сеанса подготовки профиля программа VTune выводит окно Modules Report (Сводка модулей), дающее подробную характеристику загруженности процессора, в том числе затраты процессорного времени на обработку вашей программы и компонентов операционной системы. Можно выделить любой отдельный элемент в окне Modules Report и перейти на более высокий уровень детализации. Функция Code Analysis (Анализ программы) пакета VTune выводит на экран список всех функций программы и показывает временные затраты по каждой из них. Подробный анализ позволяет узнать время обработки каждой строки исходного текста и увидеть соответствующий текст на ассемблере. В этом режиме дается информация о том, сколько процессорного времени (в тактах) затрачивается на выполнение каждой команды ассемблера. Кроме этого, в VTune содержится функция Code Coach (Оптимизация кода), которая работает совместно с Code Analysis. С ее помощью производится анализ структур кода в выбранных функциях и даются рекомендации по его преобразованию с целью повышения быстродействия. В ходе тестирования иногда возникали странности в работе интерфейса VTune, что несколько мешало. Используемая здесь схема интерфейса предусматривает наличие главного окна управления, из которого открываются окна верхнего уровня при выполнении каждой отдельной операции (как это делается в интерфейсе Visual Basic в версиях младше 5.0). Однако в отдельных случаях, например, при переходе на более детальный уровень в отчетах, система VTune формирует новое окно верхнего уровня для каждого нового уровня детализации. Если подобную операцию повторить четыре раза, то в итоге появятся четыре отдельных окна (с соответствующими кнопками на панели задач). Этот избыток открытых в VTune окон может быстро привести к перегруженности рабочего стола Windows и панели задач. VTune - мощный продукт с богатыми функциональными возможностями, предназначеннный для обслуживания крупных проектов в корпоративной среде. Однако для его освоения потребуется затратить немало усилий. Вероятно, этот пакет будет особенно полезен при оптимизации использования процессоров Intel и, конечно же, при разработке программ, интенсивно работающих в реальном времени, или мощных драйверов устройств. Однако учитывая сложность продукта, его пригодность для разработки типовых программ не столь очевидна. Если же вы решитесь на приобретение этого пакета, будьте готовы потратить длительное время на его освоение, чтобы научиться пользоваться всеми дополнительными функциями. VTune 2.4. Профиль эффективности Java-программПоскольку язык Java находится лишь на начальной стадии развития, естественно предположить, что на том же уровне находится его инструментальная оснащенность. Наше предположение подтвердилось. Среди рассмотренных в обзоре продуктов лишь в Visual Quantify предусматривается построение профилей для Java-программ, причем только в среде Windows NT и для бета-версии виртуальной машины Java (Java-VM) фирмы Microsoft. (Сообщалось о намерении фирмы Intel реализовать обработку Java-программ в версии VTune 2.4, однако во время подготовки статьи такая возможность отсутствовала.) Но, принимая во внимание основные концепции этой технологии, можно предположить, как будет определяться профиль эффективности для Java-программы. Java-компилятор анализирует исходный текст вашей Java-программы и генерирует байт-коды - лексемы, которые указывают, какую операцию выполнять. Байт-коды имеют унифицированную форму и машинно-независимы; они обозначают наиболее элементарные операции. Перед непосредственным исполнением они должны быть преобразованы в машинные команды, которые будут понятны для используемого процессора. Задача такой трансляции возлагается на виртуальную машину Java (Java-ВМ). В настоящее время уже разработаны Java-VM для различных ОС и типов процессоров. Именно из Java-VM можно получить необходимую для построения профиля информацию о ходе исполнения программы. Для этого профилировщик должен уметь считывать показания таймера об исполняемых на текущий момент байт-кодах. Чтобы реализовать такую возможность, было налажено тесное сотрудничество между фирмами Pure Atria и Microsoft при разработке новой версии Java-VM для Win32, создаваемой в Microsoft. Пакет Visual Quantify получает сведения о текущей исполняемой инструкции через интерфейсы новой Java-ВМ. По этим данным создается отчет, в котором указано время исполнения каждой функции в Java-программе. Хотя фирма Intel не сообщала, какие способы оценки профиля Java-программ будут использованы в пакете VTune, логично предположить, что их подход будет подобен тому, который применяется в Visual Quantify. Источник - http://cppclub.newmail.ru/articles/profil.html |
||||||||||||||||||
| « Пред. | След. » |
|---|


