Глава 21 Профилирование (ocamlprof)
- 21.1 Компиляция для профилирования
- 21.2 Профилирование выполнения
- 21.3 Вывод информации о профилировании
- 21.4 Профилирование по времени
В этой главе описывается, как можно профилировать выполнение программ OCaml, записывая, сколько раз вызываются функции, какие ветви условных операторов выбираются и т. д.
21.1 Компиляция для профилирования
Перед профилированием выполнения программы её необходимо скомпилировать в режиме профилирования, используя фронтенд ocamlcp к компилятору ocamlc (см. главу 13) или фронтенд ocamloptp к компилятору ocamlopt (см. главу 16). При компиляции модулей по отдельности, ocamlcp или ocamloptp должны использоваться при компиляции модулей (для получения файлов .cmo или .cmx), и могут также использоваться (хотя это не строго необходимо) при их связывании.
Примечание
Если у модуля (.ml файл) нет соответствующего интерфейса (.mli файл), то компиляция его с ocamlcp приведет к созданию объектных файлов (.cmi и .cmo), которые несовместимы с файлами, созданными ocamlc, что может привести к проблемам (если .cmi или .cmo файл всё ещё существует) при переключении между компиляциями с и без профилирования. Чтобы избежать этой проблемы, всегда следует иметь .mli файл для каждого .ml файла. Та же проблема существует и с ocamloptp.
Примечание
Чтобы убедиться, что ваши программы можно скомпилировать в режиме профилирования, избегайте использования идентификаторов, начинающихся с __ocaml_prof.
Объём информации о профилировании можно контролировать через опцию -P для ocamlcp или ocamloptp, за которой следует одна или несколько букв, указывающих, какие части программы следует профилировать:
- a
- все опции
- f
- вызовы функций: точка отсчёта устанавливается в начале тела каждой функции
- i
- if …then …else …: точки отсчёта устанавливаются как в ветви then, так и в ветви else
- l
- циклы while, for: точка отсчёта устанавливается в начале тела цикла
- m
- ветви match: точка отсчёта устанавливается в начале тела каждой ветви
- t
- ветви try …with …: точка отсчёта устанавливается в начале тела каждой ветви
Например, компиляция с ocamlcp -P film профилирует вызовы функций, if…then…else…, циклы и сопоставление с образцом.
Вызов ocamlcp или ocamloptp без опции -P по умолчанию соответствует -P fm, что означает, что профилируются только вызовы функций и сопоставление с образцом.
Примечание
Для совместимости с предыдущими версиями, ocamlcp также принимает опцию -p с теми же аргументами и поведением, что и -P.
Команды ocamlcp и ocamloptp также принимают все опции соответствующих компиляторов ocamlc или ocamlopt, за исключением опции -pp (препроцессирования).
21.2 Профилирование выполнения
Запуск исполняемого файла, скомпилированного с ocamlcp или ocamloptp, записывает счётчики выполнения указанных частей программы в файл ocamlprof.dump в текущем каталоге.
Если переменная окружения OCAMLPROF_DUMP установлена при завершении программы, то её значение используется в качестве имени файла вместо ocamlprof.dump.
Файл дампа записывается только если программа завершилась нормально (вызовом exit или дойдя до конца). Он не записывается, если программа завершилась с необработанным исключением.
Если совместимый файл дампа уже существует в текущем каталоге, то информация о профилировании накапливается в этом файле дампа. Это позволяет, например, профилировать несколько запусков программы на разных входных данных. Обратите внимание, что файлы дампов, созданные исполняемыми файлами байткода (скомпилированными с ocamlcp), совместимы с файлами дампов, созданными исполняемыми файлами нативного кода (скомпилированными с ocamloptp).
21.3 Вывод информации о профилировании
Команда ocamlprof выводит исходный код модулей программы, где счётчики выполнения вставлены в виде комментариев. Например,
ocamlprof foo.ml
выводит исходный код модуля foo с комментариями, указывающими, сколько раз были вызваны функции в этом модуле. Естественно, эта информация точна только если исходный файл не был изменён после компиляции.
Следующие опции распознаются командой ocamlprof:
- -args filename
- Считывать дополнительные аргументы командной строки, завершённые символом новой строки, из файла filename.
- -args0 filename
- Считывать дополнительные аргументы командной строки, завершённые нулём, из файла filename.
- -f dumpfile
- Указывает альтернативный файл выгрузки информации о профилировании для чтения.
- -F string
- Указывает дополнительную строку, которая должна быть выведена вместе с информацией о профилировании. По умолчанию, ocamlprof будет аннотировать программы комментариями вида (* n *), где n — значение счётчика для точки профилирования. С опцией -F s аннотация будет (* sn *).
- -impl filename
- Обработать файл filename как файл реализации, даже если его расширение не .ml.
- -intf filename
- Обработать файл filename как файл интерфейса, даже если его расширение не .mli.
- -version
- Вывести строку версии и завершить работу.
- -vnum
- Вывести короткую версию номера и завершить работу.
- -help or --help
- Отобразить краткое руководство по использованию и завершить работу.
21.4 Профилирование по времени
Профилирование с помощью ocamlprof записывает только счётчики вызовов, а не фактическое время, затраченное в каждой функции. В настоящее время нет возможности выполнять профилирование по времени для байткодовых программ, сгенерированных ocamlc. Для профилирования по времени кода нативно рекомендуется использовать стандартные инструменты, такие как perf (в Linux), Instruments (в macOS) и DTrace. Профилирование с помощью gprof больше не поддерживается.
© 1995-2022 INRIA.
https://v2.ocaml.org/releases/5.0/htmlman/profil.html