Система Turbo Profiler фирмы Borland
- Название:Система Turbo Profiler фирмы Borland
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Система Turbo Profiler фирмы Borland краткое содержание
Система Turbo Profiler фирмы Borland - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Как только в процессе выполнения достигается точка возврата из route66, профилировщик достает из стека переменные в которых накапливается статистика для функции вызвавшей данную.
Переменная, накапливающая количество обращений к вызывающей функции в этот момент не изменяется. Тем не менее, каждый импульс таймера, происходящий с этого момента до вызова highway80 добавляется, как к переменной, в которой накапливается время работы функции main, так и к переменной, в которой накапливается время выполнения всей программы. Для того, чтобы проверить этот факт, попробуйте убрать маркер «области», отмечающий route66 и затем сравнить данные, которые получаются в после этого, c профилем для случая, когда маркер установлен. Вы должны заметить, что общее время выполнения осталось тем же. Время же выполнения main должно увеличиться как раз на столько, сколько раньше требовалось для выполнения route 66.
Определение затрат времени на вызов подпрограмм.
У вас может возникнуть желание измерить время, которое тратится непосредственно на вызов подпрограммы (например подпрограммы route66), без учета времени работы самой подпрограммы. В нашем случае самым простым способом сделать это является прекращение сбора статистических данных во входной точке route66, и возобновление сбора этих данных сразу же после возврата из route66.
(Также вы можете получить информацию такого рода при работе профилировщика в пассивном режиме анализа, обсуждаемом в Главе 3). А теперь, поместите курсор на первую строку route66, затем выберите команду Operation (Работа) в локальном меню окна Module (Модуль), для того, чтобы открыть блок диалога Area Options (Параметры «области»), установите Operation (Работа) в состояние Disable (Отключить), нажмите клавишу Enter.
Когда вы отключаете сбор статистики при входе в route66, при возврате из этой подпрограммы, сбор данных автоматически не возобновляется. Вы должны установить маркер «области» на закрывающую фигурную скобку функции route66, и снова установить параметр Operation (Работа) для данного маркера «области» в состояние Enable.
Кто расплачивается за циклы.
Метафора пунктов сбора подорожной пошлины помогает объяснить почему не изменяется текущая «область» после перехода маркера «области» с последующим возвратом назад (происходящим в результате выполнения оператора goto или цикла) по адресу, предшествующему этому маркеру, хотя, c лексической точки зрения, вы находитесь вне зоны действия маркера, вы еще не встретили на своем пути какой-либо маркер. И поэтому каждый генерируемый импульс таймера продолжает ассоциироваться с последним пройденным маркером.
/* Copyright (c) 1990, Borland International */
#include
#include /* contains prototype for delay() */
main()
{
printf(«Entering main\n»);
los tin town();
delay(1000);
printf(«Leaving main\n\n»);
delay(1000);
}
los tin town()
{
int i;
printf(«Looking for highway…\n»);
delay(100);
for (i=0; i<10; i++)
{
printf(«Ask for directions\n»);
printf(«Wrong turn\n\n»);
delay(1000);
}
printf(«On the road again\n»);
}
{ Copyright (c) 1990, Borland International }
Uses Crt;
Procedure Los tin town;
Var
I: integer;
Begin writeln('Looking for highway…');
delay(100);
for I:= 0 to 9 do
Begin
Writeln('Ask for directions');
Writeln('Wrong turn');
Writeln;
delay(1000);
End;
Writeln('on the road again');
End;
Begin
Writeln('Entering Main');
Los tin town;
Delay(1000);
writeln('Leaving main');
writeln;
delay(1000);
End.
В программе plost мы усложнили подпрограмму los tin town использованием составного оператора внутри цикла. Предположим, что были установлены 3 маркера: один для функции main, один для los tin town и еще один для оператора, печатающего Wrong turn.
После того, как вы попадаете в los tin town, начинают происходить странные вещи. Когда вы входите в эту подпрограмму los tin town становиться текущей «областью». Время, приходящиеся на печать фразы «looking for highway» ассоциируется с этим маркером.
При входе в цикл время продолжает ассоциироваться с маркером подпрограммы и в первый раз, когда вы выполняете оператор печати строки «Ask for direction», время все еще относится к этому маркеру. Тем не менее стоит вам пройти маркер оператора печати «Wrong turn», все оставшееся время работы подпрограммы будет ассоциироваться с этим маркером.
Тот факт, что вы попадаете на участок программы, который ранее был ассоциирован с другим маркером, совсем не означает смены текущей активной «области». Изменение активной «области» происходит только в том случае, если вы проходите непосредственно через маркер «области» Результаты этого факта могут оказаться довольно неожиданными.
Например, если вы установили три маркера для программы plost, так как мы описали (по одному маркеру для функций main, los tin town и оператора печати строки «Wrong Turn»), то приблизительно 84 % общего времени выполнения программы будет ассоциировано с печатью строки «Wrong turn», и только 1 % времени выполнения будет связан с los tin town. Это происходит потому, что девять из десяти выполнений оператора печати строки «Ask for direction», а также все последующие операторы delay ассоциируются с маркером, помечающим оператор печати строки «Wrong Turn».
Если вы уберете маркер «области», которым помечен оператор печати строки «Wrong Turn», то 84 % остающегося времени будет затрачено на выполнение подпрограммы los tin town.
Рассмотрим следующую программу:
main.
{
while(!kbhit())
{
func1();
statement1;
statement2;
func2();
}
}
func1()
{
}
func2()
{
}
Предположим, что маркеры области в рассматриваемой программе, установлены для всех подпрограмм. Каждое из имен функции main, func1 и func2 в описаниях этих функций соответствует началу «области» и таймер генерирует импульсы с частотой 100 раз в секунду. (Предположим, что 1/100 секунды это достаточно большой промежуток времени для того, чтобы вы могли наблюдать за происходящим процессом.)
Вы входите в функцию main, и в действие вступает маркер данной функции. Система Turbo Profiler приостанавливает работу программы для обработки данной ситуации. В этот момент система Turbo Profiler устанавливает значение соответствующей переменной таким образом, что, до попадания на следующий маркер, текущей «областью» считается функция main, а также увеличивает на единицу переменную, равную числу вызовов main.
Область действия маркеров «области» определяется скорее динамически, чем лексически. Это означает, что main является текущей «областью» до тех пор, пока процесс выполнения программы не дойдет до вызова функции func1. Как только вы попадаете в func1, вы тем самым входите в новую «область», в которой вы остаетесь до тех пор, пока не натолкнетесь на вызов какой-нибудь другой функции или на оператор возврата из функции func1. Вышесказанное означает, что система Turbo Profiler помещает имена вызывающих модулей (в данном случае функции main) в стек.
Когда вы возвращаетесь из функции func1, вы проходите маркер возврата, установленный профилировщиком в момент входа в func1.
Читать дальшеИнтервал:
Закладка: