Глава 21 Профилирование (ocamlprof)
В этой главе описывается, как можно профилировать выполнение программ OCaml, записывая, сколько раз вызываются функции, выбираются ветви условных операторов и т. д.
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 (предварительной обработки).
2 Профилирование выполнения
Запуск исполняемого файла, скомпилированного с помощью ocamlcp или ocamloptp, записывает счётчики выполнения указанных частей программы в файл ocamlprof.dump в текущем каталоге.
Если переменная окружения OCAMLPROF_DUMP установлена при выходе программы, её значение используется в качестве имени файла вместо ocamlprof.dump.
Файл дампа записывается только если программа завершается нормально (вызовом exit или естественным завершением). Он не записывается, если программа завершается с неперехваченным исключением.
Если совместимый файл дампа уже существует в текущем каталоге, то информация о профилировании накапливается в этом файле дампа. Это позволяет, например, профилировать несколько выполнений программы на разных входных данных. Обратите внимание, что файлы дампов, созданные исполняемыми файлами байткода (скомпилированными с помощью ocamlcp), совместимы с файлами дампов, созданными исполняемыми файлами машинного кода (скомпилированными с помощью ocamloptp).
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 или --help
- Отобразить краткое руководство по использованию и завершить работу.
4 Профилирование по времени
Профилирование с помощью ocamlprof записывает только количество вызовов, а не фактическое время, затраченное в каждой функции. В настоящее время нет возможности выполнить профилирование по времени для байткодовых программ, сгенерированных ocamlc. Для профилирования по времени кода нативном коде рекомендуется использовать стандартные инструменты, такие как perf (в Linux), Instruments (в macOS) и DTrace. Профилирование с gprof больше не поддерживается.
© 1995-2024 INRIA.
https://ocaml.org/manual/5.2/profil.html