Profiling/ru
Профилирование и оптимизация
Профилирование служит для определения “критических” частей кода программы, оптимизация которых может серьезно улучшить общую производительность программы. Рекомендуется проводить профилирование на стадии подготовки к релизу, когда активное изменение проекта завершено или “заморожено”. Не имеет смысла тратить время на оптимизацию процедуры, которая, возможно, будет выброшена на следующий день в результате какой-нибудь переделки.
Также не следует увлекаться чрезмерной оптимизацией. Пара потраченных дней не стоят улучшения производительности на 2%. Приемлемый критерий - улучшение производительности на 30% за полчаса работы по оптимизации.
Имеет смысл потратить несколько больше усилий на оптимизацию кода, предназначенного для многократного повторного использования.
Поддержка профилирования в FreePascal
FreePascal имеет встроенную поддержку генерации исполняемых файлов, пригодных, по меньшей мере, для двух программ профилировани:
- gprof, профайлер GNU: включается с помощью
-pg.- Доступность: Большинство платформ, поддерживаемых FPC
- Примечание:
- Поддержка gprof для Linux поломана в версиях FPC 2.2.0-2.4.0 (исправлено только в svn trunk/2.5.1).
- В Windows для работоспособности gprof могут потребоваться дополнительные библиотеки.
- Valgrind, с использованием плагина Callgrind: включается с помощью
-gv.- Доступность: Linux, Mac OS X 10.5 (10.6 с нестабильными версиями Valgrind), некоторые другие UNIX.
- Примечание:
- Работает на всех платформах, на которых работает Valgrind, т.к. не требует поддержки со стороны компилятора (за исключением того, что программа должна быть скомпонована динамически и не содержать некоторых видов отладочной информации -- и то, и другое обеспечивается опцией
-gv).
- Работает на всех платформах, на которых работает Valgrind, т.к. не требует поддержки со стороны компилятора (за исключением того, что программа должна быть скомпонована динамически и не содержать некоторых видов отладочной информации -- и то, и другое обеспечивается опцией
Профилирование памяти
Heaptrc, LineInfo
Для обнаружения утечек памяти просто соберите программу с ключом "-gh". Это равнозначно добавлению модуля heaptrc первым в список используемых модулей программы. Модуль встраивается в менеджер памяти fpc и производит различные проверки.
При использовании heaptrc совместно с ключом -gl (добавление отладочной информации о строках), можно получить информацию о том, какой код вызывал утечку.
Поведение модуля heaptrc можно контролировать с помощью переменной окружения HEAPTRC, которая может содержать следующие значения:
keepreleased: освобождаемая память не выделяется повторно, а попытки записи в нее отслеживаются.disabled: отключить трассировку. Позволяет отключить проверку памяти в скомпилированной (с -gh) программе.nohalt: По умолчанию heaptrc останавливает программу при первой же найденной ошибке. Если это значение присутствует, то выполнение программы продолжится, несмотря на ошибку.haltonnotreleased: По умолчанию heaptrc печатает информацию обо всех "утечках", что может занимать много времени. Добавив этот параметр, можно ограничить печать только информацией о первой найденной утечке.log=<имя_файла>: задать имя файла, куда будет выводиться информация об утечках. Если файл не указан, используется стандартный поток вывода (stdout), при этом возможны ошибки в графических приложениях Windows.
например:
HEAPTRC=log=c:\helloworld.trc
Модуль heaptrc можно использовать явно. Однако, он должен быть также первым модулем, подключаемым программой (файлом проекта в Lazarus-е). Если heaptrc используется явно, то вы уже не сможете скомпилировать программу с -gh, однако, использование -gl необходимо для получения информации о месте утечки.
Внимание: heaptrc конфликтует с модулем cmem. При необходимости отладки внешних библиотек следует использовать Valgrind.
Дополнительная информация о модуле heaptrc в документации на RTL (англ):
Valgrind Memcheck
Модуль heaptrc может не обнаружить некоторые утечки. В состав valgrind входит утилита memcheck, которая осуществляет гораздо больше проверок и умеет обнаруживать больше разновидностей ошибок. Недостатком является низкая скорость работы, поэтому использовать memcheck рекомендуется только в случаях, когда heaptrc не помогает. Пример использования:
valgrind --tool=memcheck --leak-check=summary --log-file=log.txt ./project1
Файл log.txt почти никогда не бывает пустым, т.к. проверяется не только собственно программа, но и все используемые ей библиотеки. Качество многих библиотек часто оставляет желать лучшего.
Еще больше информации можно получить с помощью команды:
valgrind --tool=memcheck --leak-check=full --log-file=log.txt --show-reachable=yes --num-callers=50 ./project1
From the Free Pascal wiki, page "Profiling/ru", as it stood on 2017-11-19 after a change by FTurtle, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.
Talk about this page
Nobody has opened a bench for this page yet. Sign in to open one.
