Профилирование
 
Профилирование может использоваться для анализа производительности приложения.

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

FreeBASIC использует GPROF для анализа выполнения приложения. Информация профилирования собирается во время выполнения программы, а GPROF используется для анализа этой информации позднее.

Три основные шага для профилирования программы:
  • 1) Подготовить программу для профилирования путем компилирования исходника с опцией -profile.
  • 2) Запустить программу для сбора информации ( сохраняется в gmon.out ).
  • 3) Анализ собранной информации, используя GPROF.

Полная документация по GPROF находится здесь: http://www.gnu.org/software/binutils/manual/gprof-2.9.1/gprof.html. Если документация недоступна по этой ссылке, просто введите поиск в Интернете для "GNU GPROF" и соответствующая ссылка должна быть возвращена.

FreeBASIC поддерживает функции профилирования; не BASIC-блок или построчное профилирование.

Подготовка программы для профилирования

Только код, скомпилированный с параметром командной строки -profile можно профилировать. Передайте параметр -profile FreeBASIC компилятору, чтобы подготовить программу для профилирования. Это скажет компилятору на необходимость вставки специального кода в начале исходного кода, а так же в начале каждой функции.
fbc program.bas -profile

Профилирование программы

Сбор информации, необходимой для анализа выполнения программы во время работы программы. Запустите программу, чтобы начать сбор сведений о вызовах функции. Эта информация автоматически сохраняется в файле с именем gmon.out в той же директории программы.

Анализ выходных данных программы

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

Сохранение вывода из GProf в profile.txt:
gprof program[.exe] > profile.txt

Показать только плоский отчет без описания:
gprof program[.exe] --brief --flat-profile > profile.txt

Объединение результатов для более чем одной сессии

GPROF так же имеет опцию '--sum' для удобного объединения результатов из нескольких сеансов выполнения. Вот пример использования:
  • Один раз запустите программу. Это создаст gmon.out.
  • Используйте команду :
mv gmon.out gmon.sum
или
rename gmon.out gmon.sum.
  • Снова запустите программу. Это создаст новые данные в gmon.out.
  • Слияние новых данных в gmon.out в gmon.sum с помощью команды:
gprof --sum program[.exe] gmon.out gmon.sum
  • Повторите два последних шага так часто, как требуется.
  • Проанализируйте сводные данные, используя команду:
gprof program[.exe] gmon.sum > profile.txt

FreeBASIC профилирование изнутри

Когда опция '-profile' включена, один или несколько битов кода добавляются в программу.
  • Вызывается "_monstartup()" в начале неявной main для инициализации профилирования библиотеки.
  • Вызывается "mcount()" в начале каждой процедуры. При профилировании библиотеки отслеживаются существующие функции и вложенные в них функции.
  • Линковка дополнительного программного запуска объектного кода. (Например gcrt?.o)

Сама библиотека профилирования может быть в отдельной библиотеке или частью С RinTime библиотеки.
  • mingw потребует gcrt2.o и libgmon.a
  • cygwin потребует gcrt0.o и libgmon.a
  • dos потребует gcrt0.o (код профилирования в libc.a)
  • linux потребует gcrt1.o (код профилирования в libc.a)

Детали могут варьироваться от одного порта FreeBASIC к другому, но исходный код, построенный для профилирования с FreeBASIC, должен быть совместим с другими языками, которые также поддерживают GPROF.