Рекомендация: Если Ваша программа имеет очень большой размер, то сначала, для получения общей картины, мы советуем получить ее профиль, работая в пассивном режиме, и, затем, на основании полученной информации, выбрать некоторые «области» для более детального изучения.
Какие данные Вам необходимо получить в процессе профилирования?
По умолчанию, система Turbo Profiler собирает следующую информацию о помеченных Вами «областях»:
* число обращений к данной «области»;
* общее количество времени, затраченное на выполнение данной «области» (это относится только к активному режиму профилирования);
* число импульсов таймера сгенерированных во время выполнения данной «области».
Но Вы можете собрать во время профилирования и более обширную информацию:
* Активировав параметр Statistics| Callers (Статистика| Вызывающие подпрограммы) и установив соответствующим образом параметры Call Stack (Стек вызовов) в блоке диалога Area Options (Параметры «области») Вы можете проследить, какими подпрограммами вызывается помеченная подпрограмма, как часто это происходит, а также каковы пути этих вызовов.
* Если активирован параметр Statistics| Files (Статистика| Файлы), то Вам становится доступной информация о работе Вашей программы с файлами.
* Вы можете проследить за использованием Вашей программой оверлейных файлов, активировав для этого параметр Statistics| Overlays (Статистика| Оверлеи).
Как только Вы активировали соответствующие параметры меню Statistics (Статистика), Вы можете открыть соответствующие окна отчета о профилировании (использовав для этого меню View (Просмотр), затем вызвать локальные меню для каждого из окон, для того, чтобы указать детали, относящиеся к данным, которые Вы хотите получить.
Помните о том, что для получения отчета о профилировании в желаемом виде, необходимо установить соответствующие параметры до того, как Вы начнете выполнять Вашу программу.
В какой момент следует начать сбор данных?
Часто Вам необходимо собрать временные данные только о выполнении какого-то конкретного участка Вашей программы. Для того, чтобы это сделать, начните выполнение Вашей программы, вообще не собирая никакой статистической информации, установите для этого параметр Statistics| Accumulation (Статистика| Накопление) в состояние Disabled (Отключен). Вы можете в любое время посмотреть какое значение имеет параметр Accumulation (Накопление), вызвав для этого на экран блок File| Get Info (Файл| Получить информацию) и посмотрев состояние параметра Collection (Сбор).
В том случае, если параметр Accumulation (Накопление) отключен, Вы должны включить этот параметр для маркера «области», информацию о которой Вы хотите получить, и затем отключить этот параметр для маркера «области» в которой Вы хотите запретить сбор статистических данных. Число таких точек, в которых включается и выключается сбор статистических данных ограничено лишь количеством доступной оперативной памяти, как правило Вы можете задать столько таких точек, сколько Вам требуется.
Каким образом сгруппировать временные данные?
Профилировщик может изобразить временные данные для каждой из подпрограмм отдельно от других, а может объединить их с данными, соответствующими тем подпрограммам, которыми были вызваны вышеупомянутые подпрограммы.
По умолчанию предполагается, что как только активная в данный момент времени подпрограмма вызывает какую-либо другую подпрограмму, помеченную маркером «области», профилировщик помещает первую из этих подпрограмм в стек вызовов и считает, что с этого момента она находится в пассивном состоянии. И до тех пор пока управление программы находится в вызванной подпрограмме, профилировщик относит каждый импульс таймера исключительно к данной подпрограмме, забывая на это время о том, откуда она была вызвана.
Тем не менее, если Вы укажете, что вызывающая подпрограмма должна использовать объединенные часы (а не отдельные часы), то профилировщик будет относить импульсы таймера, происходящие во время выполнения вызванной подпрограммы, к обеим подпрограммам сразу.
* Если подпрограмма А не вызывает никакие другие подпрограммы, то она не появится в качестве «области» в окне Execution Profile (Профиль выполнения). Вместо этого в данном окне фигурирует подпрограмма, вызвавшая подпрограмму А, причем в качестве времени ее выполнения показывается сумма времен выполнения каждой из этих подпрограмм.
* Если подпрограмма А вызывает какие-либо другие подпрограммы, то данная подпрограмма появляется в окне Execution Profile (Профиль выполнения). И время ее выполнения включает в себя сумму времени выполнения всех подпрограмм, вызываемых данной.
Режим работы системы Turbo Profiler, задаваемый по умолчанию, использует отдельный таймер для каждой помеченной подпрограммы. Поэтому обычно время выполнения подпрограммы измеряется не учитывая времени выполнения вызываемых ею подпрограмм. Если Вы хотите, чтобы это время включалось во время выполнения рассматриваемой подпрограммы, то для этого необходимо выбрать в блоке диалога Options (Параметры) окна Areas («Области») значение параметра Timing (Подсчет времени), равное Combined (Объединенный).
Какие данные Вам необходимо просматривать?
Очень важно знать, каким образом можно контролировать количество информации, сначала собираемой, а затем отображаемой на экране профилировщиком, особенно в том случае, если Вы желаете получить подробную информацию всего лишь о некоторой части какой-то большой программы.
Система Turbo Profiler предлагает два способа для управления количеством информации о Вашей программе, выдаваемой на экран:
* Перед тем, как приступить к получению профиля, Вы можете ограничить количество собираемой информации посредством задания соответствующих значений параметров профилирования.
* После того, как профиль программы уже получен, Вы можете, при выводе на экран, отфильтровать собранные данные, изображая только те из них, которые интересуют Вас в настоящий момент.
В окнах Module (Модуль), Areas («Области») и Interrupt (Прерывания) Вы можете указывать системе Turbo Profiler для каких участков Вашей программы необходимо собирать статистические данные, и насколько эти данные должны быть подробны. Выбор степени детальности рассмотрения Вашей программы может варьироваться, начиная с рассмотрения всех подпрограмм в данном модуле и заканчивая одним единственным оператором. Вы можете собирать только временную статистику (установив режим анализа в состояние Passive (Пассивный), или же собирать полную гамму данных (все доступные данные), включающие в себя полный перечень стеков вызовов, обращений к файлам и оверлеям, а также все вызовы прерываний DOS. Вы можете увеличивать или уменьшать интервалы времени, отсчитываемые таймером, тем самым меняя степень разрешения полученного профиля программы (данная возможность имеется только в пассивном режиме работы).
Важное замечание: При выборе количества собираемых данных Вы вынуждены принимать какие-то компромиссные решения. Так как, чем более обширную и подробную информацию собирает система Turbo Profiler, тем медленнее происходит процесс получения профиля, и тем большее количество оперативной памяти требуется для собранной статистики.
Если же Вы уже получили какие-то статистические данные, то при помощи ряда команд, задаваемых в окнах, в которых находится отчет о профилировании, Вы можете временно исключить из рассмотрения некоторые из них. (смотрите соответствующий раздел данного руководства где изложена более подробная информация о фильтрации изображаемой статистики).
Получение профиля Вашей программы.
Как только Вы пометили «области», приступайте к получению профиля Вашей программы. Вы можете сохранить результаты профилирования с помощью команды Statistics| Save (Статистика| Сохранить). В результате выполнения этой команды статистика сохраняется в файле с расширением TFS (Turbo Profiler Statistics (Статистика системы Turbo Profiler). Если Вы хотите сохранить результаты нескольких сеансов профилирования, лучше всего было бы назвать файлы, в которых будут храниться эти результаты, используя некоторые соглашения, позволяющие однозначно определять в каком из файлов находятся данные каждого из сеансов (например, RUN.TFS, RUN2.TFS и т. д.). Подобные названия файлов делают более простым последующее сравнение этих данных.
Примечание: Заключение о том, что какой-либо профиль заслуживает сохранения, можно сделать лишь ознакомившись с содержанием нескольких окон Execution Profile (Профиль выполнения).
После того как Вы сохраните статистические данные в файле с рассширением. TFS, Вы можете приступить к их изучению путем просмотра информации, находящейся в различных окнах отчета о профилировании (profile report windows), причем для наилучшего понимания значения этих данных Вы имеете возможность выводить их на экран в отфильтрованном и отсортированном различными способами виде. При этом Вы не утратите каких-либо маркеров или статистических данных, так как в любое время Вы можете воспроизвести их первоначальный вид (просто загрузив информацию в профилировщик из соответствующего файла с расширением. TFS). Общее правило таково: если на получение профиля программы было затрачено большое количество времени, то следует сохранить этот профиль, за исключением, конечно, того случая, когда Вы абсолютно уверены в том, что впоследствии он Вам не понадобится.
Что Вы пытаетесь понять в ходе процесса профилирования?
Обычно программисты пользуются профилировщиком для получения ответа на один или несколько из следующих вопросов:
* Насколько эффективен данный алгоритм? (Тестирование алгоритма).
* Делает ли данная программа то, что по моему мнению она должна делать? Все ли части данной программы работоспособны?
(Верификация и тестирование)
* Сколько времени затрачивается на выполнение каждой из подпрограмм? В течение какого промежутка времени Ваша программа использует те или иные ресурсы? (Подсчет времен выполнения и контроль за использованием ресурсов (resource monitoring)
* Какова структура данной программы? (Анализ структуры программы).
Следующая таблица связывает между собой цель профилирования и тип собираемой Вами информации, необходимой для достижения данной цели.
Таблица 3.1 Способы применения профилировщика
Цель профилирования — Тип собираемой информации