Книга: Язык программирования Euphoria. Справочное руководство

3.2.1 Примечания о профилировании по времени

3.2.1 Примечания о профилировании по времени

С каждым тиком и таком системных часов генерируется так называемое прерывание от таймера. Когда вы пишете with profile_time, Euphoria будет брать выборки из вашей программы и смотреть, какая команда выполнялась на момент каждого прерывания от таймера.

Эти прерывания обычно поступают с частотой 18.2 раза в секунду, но если вы вызвали подпрограмму tick_rate(), вы можете выбрать намного более высокую частоту прерываний и, таким образом, получить более точный профиль по времени, так как он будет базироваться на большем числе выборок. По умолчанию, если вы не вызвали tick_rate(), автоматически будет вызвано tick_rate(100), как только вы начали профилирование. Вы можете установить частоту ещё более высокой (скажем, до 1000), но тогда не исключено, что производительность вашей программы снизится.

Каждая выборка требует 4-х байтов в памяти и буфер организуется обычно под 25000 выборок. Если вам необходимо больше, чем 25000 выборок, вы можете затребовать необходимый объём буфера:

with profile_time 100000

В этом случае зарезервируется пространство под 100000 выборок (к примеру). Если буфер переполняется, выдаётся предупреждение (в начале файла ex.pro). На частоте 100 выборок в секунду ваша программа может исполняться 250 секунд, пока не будет израсходован стандартный буфер на 25000 выборок. В Euphoria нет возможности динамического увеличения объёма буфера во время обработки прерывания. Именно поэтому вы должны задавать увеличение буфера сверх стандартного объёма в своей программе. Но после завершения каждой исполняемой команды высшего уровня Euphoria будет обрабатывать накопленные выборки, освобождая буфер для других выборок. Таким образом, профиль может базироваться на большем числе выборок, чем то, под которое вы фактически зарезервировали пространство.

Процент, показанный на левом поле в файле ex.pro, расчитывается путём отнесения числа выборок, пришедшихся на каждую данную команду, к общему числу взятых выборок, следовательно, если на команду пришлось 50 выборок из общего числа 500 выборок, то в поле, относящемся к этой команде, появится величина 10.0 (10 процентов). Когда профилирование остановлено командой profile(0), прерывания игнорируются, выборки не берутся, и общее число выборок не нарастает.

Увеличивая число выборок, вы можете повысить точность результатов. Тем не менее, необходимо отслеживать отсутствие ситуации, когда программа синхронизирует сама себя с прерываниями от таймера, ожидая отсчёта time(), чтобы продолжить исполнение. Команды, выполняемые сразу после точки, где проверяются часы, могут никогда не дать ни одной выборки, что могло бы дать вам весьма искажённую общую картину, то есть,

while time() do
end while

x += 1 -- эта команда не будет давать выборок

Иногда вы можете встретить значительный процент времени, уходящий на команду return. Такое обычно случается из-за освобождения большого объёма памяти, выделенного под временные и частные переменные, используемые внутри подпрограммы. Значительное время может занимать также процесс высвобождения памяти, когда присваивается новая величина большому ряду.

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

...

Оглавление книги


Генерация: 0.044. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз