Файл README.
Перед тем, как начать работу с системой Turbo Profiler, ознакомьтесь с содержимым файла README, который находится на инсталляционной дискете. Этот файл содержит самые последние сведения, которые могут отсутствовать в данном руководстве. Также он включает в себя перечень всех файлов, находящихся на дистрибутивных дискетах с кратким описанием каждого из них.
Для того, чтобы просмотреть файл README, вставьте инсталляционную дискету в дисковод А, переключитесь на работу с дисководом А; для этого необходимо набрать на клавиатуре А: и нажать клавишу ENTER, затем набрать README и еще раз нажать клавишу ENTER. Если Вы находитесь в файле README, то Вы можете перемещаться по тексту при помощи клавиш «стрелка-вверх» и «стрелка-вниз», а для окончания просмотра файла нажать клавишу SEC.
«Введение» дает общее представление о том, что такое профилирование, описывает основные характеристики системы Turbo Profiler, и готовит Вас к запуску системы Turbo Profiler на Вашем компьютере.
Глава 1, «Пример работы с профилировщиком», это учебная глава в которой описан (типичный и в то же время достаточно простой) сеанс работы с профилировщиком. Эта глава начинается с получения профиля программы, позволяющего понять, что происходит во время ее выполнения, затем последовательно проводит Вас через интерпретацию полученного профиля программы, модификацию и совершенствование программы на основе анализа профиля, и получение последующих профилей для оценки эффективности каждого изменения, внесенного в программу.
Глава 2, «Внутри профилировщика», в которой наглядно объясняется каким образом профилировщик получает количественные и временные характеристики процесса выполнения программы.
Глава 3, «Стратегия профилирования», содержит общие принципы, а также описание некоторых приемов профилирования, которые необходимо знать для успешной работы с профилировщиком.
Глава 4, «Среда системы Turbo Profiler», подробно рассказывает о каждом пункте меню и каждом параметре среды системы Turbo Profiler.
Приложение А, «Параметры командной строки системы Turbo Profiler», в нем перечислены все параметры командной строки системы Turbo Profiler и объяснено назначение каждого из параметров.
Приложение В, «Настройка системы Turbo Profiler», объясняет как пользоваться TFINST для того чтобы изменить конфигурацию системы Turbo Profiler, задаваемую по умолчанию.
Приложение С, «Удаленное профилирование», описывает как происходит профилирование с использованием двух компьютеров, на одном из которых исполняется ваша программа, а на другом Turbo Profiler.
Приложение D, «Виртуальное профилирование с использованием процессора 80386», описывает, как запустить Turbo Profiler таким образом, чтобы он пользовался только расширяемой памятью процессора 80386, оставляя все 640К основной памяти для Вашей программы.
Приложение С, «Приглашения и сообщения об ошибках», где перечислены все приглашения и сообщения об ошибках, которые могут появиться в процессе Вашей работы с системой Turbo Profiler, и даны рекомендации каким образом на них нужно реагировать.
Замечания по терминологии.
Для удобства и краткости в данном руководстве мы используем термины «модуль», «подпрограмма» и «аргумент» в более широком смысле чем обычно.
«модуль» Модуль в данном руководстве это то, что обычно называется модулем в С но так же этим словом мы называем Паскалевский UNIT.
«подпрограмма» Аналогично предыдущему термину «подпрограмма» в данном руководстве относится как к функциям С, так и к подпрограммам Паскаля, которые включают в себя функции, процедуры и методы объекта. В С функция может возвращать некоторое значение (как это делают функции в Паскале), а может и не возвращать никакого значения (аналогично процедурам в Паскале). (Если функция в С не возвращает значение, то она называется функцией типа void) Мы используем термин подпрограмма для обозначения как функций С, так и процедур и функций Паскаля.
«аргумент» И, наконец, термин «аргумент» в данном руководстве используется в качестве эквивалента термина параметр. Он применяется для обозначения аргументов командной строки, используемых при вызове программ из DOS, с таким же успехом как и для обозначения аргументов, передаваемых подпрограмме.
Профилирование — это одна из еще пока недооцениваемых, но очень полезных и даже жизненно необходимых частей процесса создания качественного программного обеспечения. Обзоры показывают, что, на самом деле, только незначительная часть профессиональных программистов использует профилировщики для улучшения своих программ. Другие же исследования говорят о том, что в большинстве случаев даже опытные программисты неправильно указывают критические участки («узкие места») в своих программах.
Каковы же преимущества использования описываемого нами орудия? Во-первых профилирование Ваших программ может повысить их производительность. Во-вторых профилирование может усилить вашу способность создания эффективных программ. И, наконец, профилирование, как и отладка, может стать неотъемлемым элементом цикла создания программного обеспечения.
В этой главе мы продемонстрируем Вам пример того, каким образом можно извлечь пользу из применения профилировщика, и как в дальнейшем профилирование может сэкономить Вам часы во время поиска строк программы, расточительно использующих ресурсы компьютера. Вы научитесь применять профилировщик для того чтобы:
* обнаруживать где и на что ваша программа расходует время;
* создавать аннотированный листинг исходного текста Вашей программы и статистический отчет о профилировании;
* запоминать статистические данные, полученные в результате профилирования и затем, после перерыва, возвращаться к работе с этими данными;
* анализировать статистику профилирования и исходный текст Вашей программы, находящиеся, в соседних окнах.
Примечание: Примеры этой главы основаны на колонке Джона Бентли в журнале Communications of the ACM (июль
1987), которая называется «Жемчужины программирования»
(«Programming Pearls»).
Примечание: Все примеры были опробованы на машине с 286 процессором и видеоадаптером Hercules.
Примеры в данной главе основываются на поиске и распечатке всех простых чисел, находящихся в диапазоне от 1 до 1000. Вспомним, что число является простым если оно делится только на 1 и само на себя, очевидно, что оно должно быть нечетным, так как любое четное число делится на 2 и, следовательно, не является простым. Для того чтобы определить, является ли данное число простым, необходимо проверить не является ли какое либо простое число, меньшее данного, его делителем, а так же проверить не делится ли рассматриваемое число на какое — нибудь целое, большее двух первых простых чисел 2 и 3.
Целью профилирования программ-примеров является ускорение процесса нахождения и печати простых чисел. Проработав эти примеры Вы научитесь использовать Turbo Profiler для определения эффективности структуры программы каждого из примеров.
Первой программой, которую мы рассмотрим, будет PRIME0. Как только Вы отпрофилируете ее и поймете в каких местах необходимо изменить ее текст, Вам необходимо переходить к следующему шагу — загрузке и профилированию PRIME1. За исключением PRIME1, каждая из программ, рассматриваемых в данной главе (PRIME2, PRIME3, PRIME4, PRIME5 и PRIME6) является модификацией предыдущей.
Важное замечание: Информация для пользователей Паскаля.
Программы PRIMEn.* написаны на Turbo C. Для пользователей Паскаля имеются аналоги этих программ PRIMEnPA.* которые могут использоваться для упражнений во время чтения данной главы. Каждое обсуждение профилирования программы, написанной на С сопровождается комментарием, отражающим отличия в случае профилирования Паскалевской программы.
Убедитесь, что все файлы с примерами (PRIMEn.C и PRIMEn.EXE или PRIMEnPA.PAS и PRIMEnPA.EXE) находятся в Вашей текущей директории.
Для каждого из описываемых примеров имеются как исходные файлы, так и выполнимые файлы, поскольку для анализирования программы Turbo Profiler требуются и те и другие. Каждый из примеров был скомпилирован с полной символической информацией, так как эта информация необходима для профилирования.
Для того чтобы обеспечить наличие полной символической информации для Ваших программ, необходимо при их компиляции задать следующие параметры:
Turbo C++: При работе в интегрированной среде, необходимо выбрать в меню Options| Full Menus (Параметры| Полный набор меню) затем открыть блок диалога отладчика (для этого надо выбрать Options| Debugger (Параметры| Отладчик)), и установить Source Debugging (Отладка на уровне исходного кода) в значение Standalone (Самостоятельный отладчик). При компиляции с использованием командной строки необходимо задавать параметр — v.
Turbo C: Если Вы компилируете в интегрированной среде, то необходимо перед компиляцией программы выбрать Standalone (Самостоятельный отладчик) в параметрах отладчика Debug| Source Debugging (Отладчик| Отладка на уровне исходного текста). При компиляции с использованием командной строки необходимо задавать параметр — v.
Turbo Pascal: Если Вы компилируете в интегрированной среде, необходимо установить пункты меню Options|Debug Information (Параметры|Отладочная информация) и Debug|Stand-Alone Debugging (Отладка| Самостоятельный отладчик) в состояние On. При компиляции с помощью командной строки необходимо использовать параметр /v.
Turbo Assembler: Необходимо использовать параметр /zi, затем строить загрузочный модуль при помощи TLINK, задавая при этом параметр /v.
Информация для пользователей 80x87.
Поскольку Turbo Profiler способен использовать возможности математического сопроцессора, в том случае если сопроцессор установлен на Вашем компьютере, и Вы хотите получить статистические данные, соответствующие изложенным в настоящем руководстве, то Вам необходимо временно запретить использование сопроцессора (в противном случае полученные вами результаты будут значительно отличаться от приведенных в этом тексте). Для того чтобы Turbo Profiler не пользовался возможностями сопроцессора достаточно перед началом работы с профилировщиком выполнить команду DOS SET 87=N. Но даже в этом случае полученные статистические данные могут сильно отличаться от изложенных в данном руководстве, из-за несовпадения технических характеристик компьютеров таких, например, как быстродействие процессора.
Профилирование программы (PRIME0)