Система Turbo Profiler фирмы Borland | страница 29




Когда вы отключаете сбор статистики при входе в route66, при возврате из этой подпрограммы, сбор данных автоматически не возобновляется. Вы должны установить маркер «области» на закрывающую фигурную скобку функции route66, и снова установить параметр Operation (Работа) для данного маркера «области» в состояние Enable.


Кто расплачивается за циклы.


Метафора пунктов сбора подорожной пошлины помогает объяснить почему не изменяется текущая «область» после перехода маркера «области» с последующим возвратом назад (происходящим в результате выполнения оператора goto или цикла) по адресу, предшествующему этому маркеру, хотя, c лексической точки зрения, вы находитесь вне зоны действия маркера, вы еще не встретили на своем пути какой-либо маркер. И поэтому каждый генерируемый импульс таймера продолжает ассоциироваться с последним пройденным маркером.


/* Copyright (c) 1990, Borland International */

#include

#include /* contains prototype for delay() */


main()

{

printf(«Entering main\n»);

lostintown();

delay(1000);

printf(«Leaving main\n\n»);

delay(1000);

}


lostintown()

{

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 Lostintown;

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');

Lostintown;

Delay(1000);

writeln('Leaving main');

writeln;

delay(1000);

End.


В программе plost мы усложнили подпрограмму lostintown использованием составного оператора внутри цикла. Предположим, что были установлены 3 маркера: один для функции main, один для lostintown и еще один для оператора, печатающего Wrong turn.


После того, как вы попадаете в lostintown, начинают происходить странные вещи. Когда вы входите в эту подпрограмму lostintown становиться текущей «областью». Время, приходящиеся на печать фразы «looking for highway» ассоциируется с этим маркером.


При входе в цикл время продолжает ассоциироваться с маркером подпрограммы и в первый раз, когда вы выполняете оператор печати строки «Ask for direction», время все еще относится к этому маркеру. Тем не менее стоит вам пройти маркер оператора печати «Wrong turn», все оставшееся время работы подпрограммы будет ассоциироваться с этим маркером.