Изменения

Перейти к: навигация, поиск

R:Профилирование кода

40 байтов добавлено, 14:22, 27 февраля 2014
м
Нет описания правки
{{Pkg-req-notice}}
== Пакет <code>{{r-package|base</code> |core=true}} ==
Описанные выше функции <code>system.time()</code>, <code>benchmark()</code>, <code>microbenchmark()</code> позволяют оценить общее время выполнения выражения и нивелировать возможные вариации за счет множества попыток, однако для более полной оценки и определения стратегии оптимизации кода необходимо также выявлять и «узкие» места в выполняемом коде. К подобным «узким» местам можно отнести те вызовы, которые занимают наибольшее количество времени или расходуют больше всего памяти (при профилирования расхода памяти). Существуют специальные пакеты, предназначенные для организации профилирования или для более наглядной демонстрации результатов, однако далее пойдет речь о функции <code>Rprof()</code> из пакета <code>{{r-package|base</code>|core=true}}.
Принцип работы функции <code>Rprof()</code> таков: с заданным интервалом (аргумент <code>interval</code>) делаются «снимки» вызовов и записываются в файл. Следует помнить о том, что <code>Rprof()</code> делает «снимки» каждые 0.02 секунды (значение по умолчанию), поэтому если выражение выполняется быстрее, то <code>Rprof()</code> не сможет его отследить. В таком случае периодичность «снимков» можно задать вручную с помощью аргумента <code>interval</code>. Также можно увеличить объём данных, чтобы код выполнялся дольше.
}}
== Пакет <code>{{r-package|proftools</code> }} ==
Также может оказаться полезной функция <code>flatProfile()</code> из пакета <code>{{r-package|proftools</code>}}. Данная функция выводит таблицу, сходную с таблицей «by.total» возвращаемую функцией <code>summaryRprof()</code>, в одну и сортирует их по общему времени выполнения в процентах или по времени выполнения функции в процентах, если указать <code>byTotal = FALSE</code>:
{{r-code|code=
Функция интересна тем, что предоставляет более компактный вывод при той же информативности, что и функция <code>summaryRprof()</code>.
== Пакет <code>{{r-package|profr</code> }} ==
Пакет <code>{{r-package|profr</code> }} предоставляет несколько функций для упрощения процесса профилирования, а также позволяет графически представить результаты профилирования. Результаты работы функции <code>profr</code> представляют собой таблицу, с хронологическим перечислением вызовов. Поэтому при использовании данной функции необходимо использовать однократное выполнение выражения. Вышеприведённый листинг по профилированию работы функции <code>desc()</code> будет выглядеть следующим образом:
{{r-code|code=
Рассмотрим ещё один способ представления результатов профилирования --- функция <code>proftable()</code>, написанная Noam Ross. Исходный код данной функции доступен под лицензией GNU GPL v2 и размещён в открытом доступе на [https://github.com/noamross/noamtools/blob/master/R/proftable.R github].
Мы переработали данную функцию, удалив зависимость от пакета <code>{{r-package|plyr</code> }} и существенно ускорив её. Код модифицированного варианта доступен в [https://bitbucket.org/psylab/r-scripts/src/master/proftable.R git-репозитории]. Импортировать данный скрипт можно с помощью функции <code>source_url()</code>, которая входит в состав пакета <code>{{r-package|devtools</code>}}<ref>Штатная функция <code>source()</code> из пакета <code>{{r-package|base</code> |core=true}} не поддерживает загрузку файлов по протоколу https.</ref>:
{{r-code|code=

Навигация