Профилировщик высшего уровня
На страницах "Компьютерных вестей" я рассказывал о самых разнообразных инструментах, которые применяются в нелёгком труде тех, кто создаёт программное обеспечение. Сегодня настал черёд профилировщика AQtime.
Введение
Хотя в наше время работа программиста, которая нужна для оптимизации программ, стоит гораздо больше, чем то "железо", на котором программы будут работать, всё равно в ряде случаев никак не избежать суровой необходимости что-то оптимизировать. Потому что если не оптимизировать, то никое "железо" не справится с той нагрузкой, которую возложит на него подобный неоптимизированный софт.
В первую очередь, конечно, речь о приложениях, использующих "тяжёлую" графику, а также о всяческих серверах, которые должны показывать высокую скорость работы даже при большом количестве адресованных им запросов (в разумных пределах, конечно, но всё-таки). Но на этом список, конечно, не заканчивается. Приложениям, выполняющим различные научные расчёты, например, также критична скорость их выполнения. В общем, как видите, даже в современных условиях не всё можно отдать на откуп быстрому "железу" - кое-где и от софта требуется изрядное проворство.
Но время программиста всё-таки дорого, как ни крути, а потому заставлять его оптимизировать тотально всё очень накладно. Выход, конечно же, есть - в оптимизации самых "узких" мест приложения, которые являются самыми пагубными для его производительности в целом. В общем-то, в теории это звучит красиво и понятно, но на практике всё упирается в простой вопрос: а какое место в приложении самое "узкое"? К сожалению, все попытки найти его с помощью одного только анализа исходного кода смахивают на гадание на кофейной гуще, потому что даже идеально написанный код может работать далеко не идеально из-за "косяков" в самой архитектуре программного продукта. Поэтому и возникает необходимость в использовании специальных программ, которые и покажут самые медленные участки готового программного кода - именно эти программы и называются профилировщиками, и именно к этому классу программ принадлежит обсуждаемый нами инструмент.
Знакомство
Дистрибутив пробной версии данной программы можно взять на сайте www.automatedqa.com/products/aqtime. Приготовьтесь к тому, что даже пробная версия программы потребует у вас активации (правда, в силу своей "пробности" она бесплатна). Стоимость полной версии на одного пользователя составляет чуть менее 600 "американских рублей". Но, в общем-то, учитывая всё сказанное выше о стоимости труда программиста, это вполне оправданные затраты.
Какие приложения можно профилировать с помощью AQtime? Ещё при загрузке инсталляционного пакета, имеющего расширение EXE, вам наверняка станет понятно, что приложения под Linux, Mac OS X и прочие системы вряд ли получится оптимизировать по времени работы критических участков кода с использованием этого программного продукта. А вот Windows-приложения - очень даже запросто. Причём речь идёт не только о родных Win32 и Win64-приложениях, скомпилированных в родной исполняемый код платформы. С помощью AQtime вы имеете возможность также профилировать .NET-приложения для всех версий .NET Framework'а (т.е. NET 1.0, 1.1, 2.0, 3.0 и 3.5). Ну а в придачу ко всему этому у вас ещё есть возможность профилировать функции на Jscript'е и VBScript'е.
Пожалуй, главное, чем подкупает этот профилировщик, - это отсутствие необходимости модифицировать исходный код приложения и делать специальный "билд" для того, чтобы его затем профилировать. Мелочь, скажете? Не совсем. Дело в том, что любые модификации - это какое-то количество труда, затраченного программистами. С помощью AQtime вы можете сэкономить на модификациях как время, так и деньги, поскольку здесь в самом что ни на есть прямом виде работает формула "время = деньги".
AQtime может работать как самостоятельная среда или же как интегрированная часть сред разработки. Профилировщиком поддерживаются такие популярные среды разработки, как Microsoft Visual Studio и Borland Developer Studio/CodeGear RAD Studio - в общем-то, самые популярные среды разработки Windows-приложений. В принципе, на мой взгляд, в этой интеграции нет особо глубокого смысла по причине того, что у самого AQtime очень удобный интерфейс, и профилировка вряд ли потребует такой глубокой интеграции в среду, как та же отладка.
Работа с AQtime
В общем-то, вполне понятно, что для того, чтобы проанализировать исполняемый файл с помощью AQtime, его сначала нужно загрузить в среду и выполнить. Для того, чтобы анализ был возможен, в файле должна присутствовать отладочная информация. В справке можно найти подробно расписанные настройки для всех поддерживаемых Win32 и .NET-компиляторов, с которыми должен быть скомпилирован анализируемый исполняемый файл в среде AQtime.
В зависимости от платформы, для которой написано приложение, а также от языка программирования, могут быть доступны несколько разных вариантов анализа его исполняемого файла. Вот на этих вариантах мы с вами сейчас и остановимся подробнее.
Для начала - о тех, которые в самом AQtime находятся в конце списка и не требуют запуска приложения для анализа. Таким образом, как вы понимаете, анализ с помощью этих инструментов является статическим, однако это вовсе не означает, что он бесполезен - всё обстоит с точностью до наоборот. Статических анализаторов всего четыре. Первый, Static Analysis, позволяет получить общую информацию о приложении (размер функций в байтах, их адреса в памяти) и информацию о конкретных функциях (количество циклов в функции, количество условных операторов и т.д.). Следующий, Sequence Diagram Link, анализирует последовательность выполнения функций в программном коде, и по результатам анализа строит наглядную диаграмму в Microsoft Visio или Microsoft Word. Следующий статический анализатор имеет название Unused VCL Units и предназначен для поиска неиспользуемых модулей в программах, созданных с применением Delphi или C++ Builder. Такой анализ позволит несколько уменьшить размер исполняемого файла, получающегося при использовании этих сред, если из исходного текста программы убрать упоминание лишних модулей. Ну и, наконец, четвертый инструмент статического анализа, Platform Compliance, позволяет убедиться в том, что приложение может быть запущено на определённых целевых платформах - например, с его помощью можно узнать, какие дополнительные DLL'ки для этого понадобятся.
Что ж, перейдём к инструментам динамического анализа. Их уже чуть больше, что, в принципе, вполне объяснимо. Самый важный - это Performance, как раз и включающий основную функциональность профилировщика по измерению времени выполнения того или иного программного кода. Помимо, собственно, времени, можно также выяснять такие подробности, как количество вызовов той или иной функции, иерархию вызовов функций, количество обновлений кэша CPU при работе функции и т.д., и т.п. Следующий динамический анализатор, присутствующий в составе AQtime, имеет, скорее, историческое значение и сегодня вряд ли будет активно использоваться разработчиками. Называется он BDE SQL и предназначен для анализа SQL-запросов через Borland Database Engine. Следующий инструмент, Reference Count, позволит посчитать количество ссылок на COM-объекты в каждый момент выполнения приложения и определить, таким образом, правильность уничтожения COM-объектов при отсутствии ссылок на них.
Анализатор Allocation позволяет проверить выделение памяти при работе "родных" 32- и 64-битных приложений для Windows. С его помощью можно узнать количество создаваемых экземпляров объектов, размер памяти под каждый из них, связи между объектами, количество используемых блоков памяти и т.д. Инструмент под названием Resource позволит проследить за выделением и высвобождением в приложении системных ресурсов, т.е. различных дескрипторов. Анализатор Coverage позволит вам узнать, вызывалась ли какая-то конкретная функция или строчка кода в процессе профилировки кода, и если да, то сколько именно раз она вызывалась. В принципе, примерно то же самое делает и инструмент Light Coverage, но без столь глубокого анализа выполнения кода и, соответственно, несколько быстрее.
Следующий по счету инструмент анализа называется Exception Trace, и предназначается он для получения информации об исключениях, возникших в процессе выполнения приложения. Инструмент Function Trace позволяет увидеть взаимосвязь между функциями в приложении, т.е. порядок, в котором одна функция вызывает другую, другая - третью, ну и так далее по списку. В чем-то это похоже на то, что делает Sequence Diagram Link, однако, во-первых, здесь анализ производится в динамическом режиме, а во-вторых, производится детальный анализ вызываемых функций и передаваемых им параметров. Наконец, последний по списку инструмент, Load Library Tracer, используется для отслеживания динамической загрузки и выгрузки динамических же библиотек.
Резюме
Как видите, арсенал инструментов, которые предлагают создатели AQtime, очень велик. И высокая цена, которую просят разработчики за свой труд, вполне оправдана богатой функциональностью. Думаю, если вы действительно нуждаетесь в хорошем профилировщике, который будет использоваться не единожды, а многократно при разработке Windows или .NET-приложений, то это именно тот инструмент, на который вам стоит обратить внимание в самую первую очередь.
Вадим СТАНКЕВИЧ,
dreamdrusch@tut.by
Горячие темы