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




Тот факт, что вы попадаете на участок программы, который ранее был ассоциирован с другим маркером, совсем не означает смены текущей активной «области». Изменение активной «области» происходит только в том случае, если вы проходите непосредственно через маркер «области» Результаты этого факта могут оказаться довольно неожиданными.


Например, если вы установили три маркера для программы plost, так как мы описали (по одному маркеру для функций main, lostintown и оператора печати строки «Wrong Turn»), то приблизительно 84 % общего времени выполнения программы будет ассоциировано с печатью строки «Wrong turn», и только 1 % времени выполнения будет связан с lostintown. Это происходит потому, что девять из десяти выполнений оператора печати строки «Ask for direction», а также все последующие операторы delay ассоциируются с маркером, помечающим оператор печати строки «Wrong Turn».


Если вы уберете маркер «области», которым помечен оператор печати строки «Wrong Turn», то 84 % остающегося времени будет затрачено на выполнение подпрограммы lostintown.


Рассмотрим следующую программу:


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) в стек.