Встроенный профайлер

From SunFlurry wiki
Jump to: navigation, search

Встроенный профайлер используется как основной инструмент для нахождения узких мест в производительности обработок, оптимизации и улучшения скорости их работы, т.е. для их профилирования. При включении профайлера для любой исполняемой строки кода накапливается количество реального времени, затраченное системной на ее выполнение, кроме того, система также ведет учет, какое количество раз происходило выполнение этой строчки со времени включения профайлера. Для того, чтобы время учитывалось корректно, в операционной системе необходимо наличие таймера высокой точности (HRPC, high-resolution performance counter). Обычно он включается в BIOS компьютера. Без таймера высокой точности, профайлер не будет накапливать затраченной время, а только количество обращений к строке исходного текста, что зачастую недостаточно для профилирования обработок. После выполнения обработки, программу снова необходимо остановить, и остановить профайлер в отладчике. В этот момент окно отладчика должно отображать информацию по накопившемуся времени исполнения для каждой строки, для которой производилось исполнение, кроме того имеется возможность получить сортированную таблицу с сотней строк, с максимальным временем исполнения для текущего модуля (выбранного в отладчике), либо для всех модулей, в которых происходило исполнение, пока был включен профайлер.

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

Профайлер встроен в окно отладчика, при его включении, в окно будут добавлены две левые панели:

  1. Панель с накопленным временем исполнения строки будет добавлена только, если в системе доступен таймер высокой точности. Панель отображает накопленное время в единицах:
    • Наносекунды (ns, одна миллиардная секунды). Будут показаны целые числа от 1 до 999999.
    • Единицы времени микросекунды не используются.
    • Миллисекунды (ms, одна тысячная секунды). Будут показаны выделенные синим цветом дробные числа от 1 до 999.999.
    • Секунды (s). Будут показаны выделенные красным цветом дробные числа от 1 до 59.999.
    • Минуты (m). Будут показаны выделенные розовым цветом дробные числа от 1 до 59.999.
    • Часы, Дни, Года (h, d, y). Будут показаны выделенные определенным цветом дробные числа.
  2. Панель с накопленным количеством обращений к строке. Панель отображает накопленное количество обращений. Если количество обращений к строке больше миллиона, будет показано дробное число с префиксом, в зависимости от его величины.
  3. Диалог Top 100 по строкам или функциям (см. ниже работу с профайлером из отладчика) показывает список строк или функций с наибольшим затраченным временем исполнения. Диалог может быть отсортирован по любому из столбцов. Двойной клик мыши по строке позволяет перейти к соответствующей строке в окне с исходными текстами.

Работа с профайлером из отладчика

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

  • Включить профайлер -- пункт меню с переключателем, позволяющий включить профайлер или выключить его. При включении профайлера, если в системе недоступен таймер высокой точности, будет выедено соответствующее предупреждение.
  • Показывать время исполнения в % -- пункт меню с переключателем, позволяющий включить или отключить режим, когда вместо накопленного времени для каждой из строк будет показано отношение накопленного времени исполнения к общему времени исполнения в процентах.
  • Обнулить счетчики / закрыть профайлер -- даже если профайлер будет выключен с помощью первого пункта меню, накопленная им информация не будет удалена. Чтобы удалить всю накопленную информацию и спрятать обе дополнительные панели профайлера, можно использовать этот пункт меню.
  • Обнулить счетчик текущей строки (Ctrl+Q) -- пункт позволяет исключить строку под курсором из результатов профилирования и обнулить счетчик времени и количество обращений к ней. Это может быть полезно, к примеру, для исключения вызовов визуальных функций (AskNumber или подобных).
  • Top 100 по строкам (все модули) (Ctrl+[) -- пункт позволяет вывести диалог ста строк исходного текста из всех модулей, с информацией по исполнению в профайлере. Будут выведены строки, для которых зафиксировано максимальное время исполнения.
  • Top 100 по функциям (все модули) (Ctrl+]) -- пункт позволяет вывести диалог ста функций исходного текста из всех модулей, с информацией по исполнению в профайлере. Будут выведены строки с функциями, для которых зафиксировано максимальное время исполнения.
  • Top 100 по строкам (текущий модуль) -- пункт позволяет вывести диалог ста строк исходного текста активного в данный момент модуля. Будут выведены строки, для которых зафиксировано максимальное время исполнения.
  • Top 100 по функциям (текущий модуль) -- пункт позволяет вывести диалог ста функций исходного текста активного в данный момент модуля. Будут выведены строки с функциями, для которых зафиксировано максимальное время исполнения.

Программная работа с профайлером

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

  • DebuggingRights -- функция позволяет включить или отключить права отладки. Без этих прав, профайлер не будет работать.
  • ProfilerStart -- функция инициирует запуск профайлера из программы.
  • ProfilerStop -- функция инициирует остановку профайлера из программы, при этом накопленные профайлером данные профилирования не будут удалены.
  • ProfilerClear -- функция удаляет все данные, накопленные профайлером из системы, что соответствует пункту Обнулить счетчики / закрыть профайлер из главного меню окна отладчика.
  • Debugbreak -- функция позволяет выполнить остановку выполнения и вывести на экран окно отладчика (в окне могут уже содержаться результаты профилирования).

Стандартный процесс включения функций профилирования в рабочий код обычно выглядит следующим образом:

//Включить режим отладки. Если режим включен по умолчанию, данная строка не требуется.
DebuggingRights(1);

//Очистить предыдущие результаты профилирования. Данная строка полезна, если код будет выполняться несколько раз.
//При запуске кода из панели управления визуального клиента, каждый новый запуск фрагмента является новым исходным текстом, 
//  поэтому, старые результаты не будут смешиваться с новыми.
ProfilerClear;

//Включить профайлер. После этой функции располагается код, профилирование которого необходимо выполнить
ProfilerStart;

...


//Останавливаем профайлер. Код выполнился, результаты профилирования доступны в окне отладчика.
ProfilerStop;


//Вызываем окно отладчика для просмотра результатов профилирования.
DebugBreak;

//Функция DebugBreak не должна быть последней в исполняемом фрагменте или модуле
Message("Тест выполнен успешно");