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




Когда вы возвращаетесь из функции func1, вы проходите маркер возврата, установленный профилировщиком в момент входа в func1.

Функция main снова становится текущей «областью». Каждый такт таймера, во время которого выполняется statement1 или statement2, считается относящимся к «области», задаваемой функцией main.


На этом этапе происходят две вещи:


1. Каждый раз, когда вы попадаете в какую-нибудь «область», профилирование вызывает внутреннюю подпрограмму, которая соответственным образом изменяет значение переменных и состояние стека вызовов подпрограмм. С каждой «областью» связаны две переменных, в одной из этих переменных суммируется время выполнения «области», а в другой — количество обращений к ней. Каждый раз, когда вы попадаете в «область» пройдя через помечающий ее маркер, переменная, равная числу обращений к данной «области» увеличивается.


2. На каждом такте таймера, профилировщик вызывает другую внутреннюю подпрограмму, которая проверяет, какая из «областей» является текущей, затем увеличивает значение переменной, хранящей временные данные для рассматриваемой «области», на соответствующую величину.


Когда выполнение программы заканчивается, система Turbo Profiler, на основании значений переменных, в которых накапливалось число тактов таймера, вычисляет время работы каждой «области».


Если вы отключите сбор статистики при входе в функцию func1, то возврат из этой функции еще не будет означать автоматического возобновления сбора статистики. Вы должны явно задать возобновление сбора статистических данных в точке возврата из func1.


Что же вам делать в случае нескольких операторов return? Ответ на этот вопрос заключается в использовании единственной настоящей точки возврата только в самом конце тела функции.


Важное замечание о точках возврата:


Хотя вы формально и можете задать в функции несколько точек возврата, компилятор Turbo C, на самом деле, преобразует все эти точки в переходы на единственную настоящую точку возврата, расположенную в самом конце функции. При установке маркера «области» на каком-либо операторе возврата на самом деле помеченной оказывается строка ассемблерного кода, соответствующая закрывающей фигурной скобке, которой завершается описание данной функции. Эта строка представляет собой ассемблерный вариант оператора возврата, на который осуществляется переход из всех остальных точек функции, где встречается оператор return.


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