Система Turbo Profiler фирмы Borland | страница 29
Когда вы отключаете сбор статистики при входе в route66, при возврате из этой подпрограммы, сбор данных автоматически не возобновляется. Вы должны установить маркер «области» на закрывающую фигурную скобку функции route66, и снова установить параметр Operation (Работа) для данного маркера «области» в состояние Enable.
Кто расплачивается за циклы.
Метафора пунктов сбора подорожной пошлины помогает объяснить почему не изменяется текущая «область» после перехода маркера «области» с последующим возвратом назад (происходящим в результате выполнения оператора goto или цикла) по адресу, предшествующему этому маркеру, хотя, c лексической точки зрения, вы находитесь вне зоны действия маркера, вы еще не встретили на своем пути какой-либо маркер. И поэтому каждый генерируемый импульс таймера продолжает ассоциироваться с последним пройденным маркером.
/* Copyright (c) 1990, Borland International */
#include
#include
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», все оставшееся время работы подпрограммы будет ассоциироваться с этим маркером.