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




По умолчанию, при первом получении профиля программы параметр Callers (Вызывающие подпрограммы) для всех маркеров «области» типа «точка входа в подпрограмму» имеет значение None (Никакие).


Установка параметра Statistics| Callers (Статистика| Вызывающие подпрограммы), находящегося в главном меню, в состояние Enable (Включено) равнозначна установке значения All Callers (Все вызывающие подпрограммы) параметра Сallers (Вызывающие подпрограмм) для каждого маркера «области», установленного в окне Areas («Области»). Тем не менее, если Вы вручную установили значения параметров Callers (Вызывающие подпрограмм) для каких-либо «областей» в окне Areas («Области»), то, в этом случае, установка параметра Statistics| Callers (Статистика| Вызывающие подпрограммы) в состояние Enable (Включено), не изменит значение параметра Callers (Вызывающие подпрограммы) для таких «областей».


Установка параметра Statistics| Callers (Статистика| Вызывающие подпрограммы) в некоторой точке программы в состояние Disable (Отключено) указывает профилировщику, чтобы он не сохранял никакой информации из стека вызовов, но это совершенно не влияет на действие параметров Caller (Вызывающая подпрограмма), установленных в окне Areas («Области») (как и при установке данного параметра в состояние Enable (Включено)).


Опрос вместо подсчета.


На самом деле, профилировщик не измеряет время непосредственно, а очень точно вычисляет его на основании информации о количестве прерываний таймера.


Этот способ подсчета времени можно рассматривать как один из видов статистического моделирования (некий статистический опрос).

Периодически запрашивая, какая из «областей» является текущей, и, имея для каждой из «областей» счетчик, (который увеличивается при каждом прерывании таймера, если в этот момент «область» является текущей), профилировщик может вычислить время, затраченное на выполнение данной «области».


Примечание: Все вышесказанное имеет место только в случае работы в пассивном режиме профилирования.


Профилировщику известно общее время выполнения программы.

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


<время выполнения «области»> = <общее время выполнения программы> * <значение счетчика «области»> / <значение счетчика программы>


Но, на самом деле, нельзя утверждать, что значение времени, вычисленное по приведенной формуле, в точности совпадает с количеством времени, затраченным на выполнение данной «области». Если Ваша программа содержит в себе цикл, в котором, с частотой, кратной частоте прерывания таймера происходит обращение к некоторой подпрограмме (например к подпрограмме генерации звука одной тональности), то большинство моментов времени, в которые будут генерироваться импульсы таймера может прийтись на выполнения некоторой строки (или «области»). Описанное явление резонанса может возникнуть даже в случае, когда рассматриваемая строка не принадлежит к числу основных потребителей времени выполнения Вашей программы. Подобные ситуации редки, но вполне возможны.