Изменения

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

R:Измерение времени выполнения выражений

770 байтов добавлено, 16:31, 22 января 2014
м
Функция system.time()
== Функция system.time() ==
Самый простой инструмент для измерения времени выполнения кода - функция {{Inline-code|system.time()|lang="rsplus"}} из пакета {{Inline-code|base|lang="rsplus"}}. В качестве аргумента функция {{Inline-code|system.time()|lang="rsplus"}} принимает выражения и возвращает время выполнения данного выражения. Измерим время выполнения функции {{Inline-code|Sys.sleep()|lang="rsplus"}}, которая останавливает выполнение кода на заданный интервал времени (в секундах):
<syntaxhighlight lang="rsplus">
Как видим, на выполнение данной операции заняло ровно одну секунду.
Приведём ещё один пример. Сравним время вычисления встроенной в R функции ({{Inline-code|mean()|lang="rsplus"}}) и среднего, вычисленного по формуле <math>\frac{1}{n}\sum_{i=1}^{n}x_{i}</math>. на сгенерированном массиве нормально распределенных значений:
<syntaxhighlight lang="rsplus">
Функция возвращает 3 значения:
* {{Inline-code|user|lang="rsplus"}} - время CPU, которое занял пользователь;* {{Inline-code|system|lang="rsplus"}} - время CPU, которое заняла система;* {{Inline-code|elapsed|lang="rsplus"}} - реальное время, которое заняло выполнение команды.
Соответственно, в выводе функции нас интересует значение {{Inline-code|elapsed|lang="rsplus"}}, который показывает время выполнения функции (выражения) в секундах. Как мы видим, внешне более сложное выражение {{Inline-code|sum(x) / length(x)|lang="rsplus"}} выполняется быстрее стандартной функции {{Inline-code|mean(x)|lang="rsplus"}}.
К сожалению, подобный способ достаточно ненадежен, так как для оценки времени выполнения выражения функция {{Inline-code|system.time()|lang="rsplus"}} обращается к системным значениям времени. Следовательно, если во время выполнения кода параллельно производятся и другие операции на компьютере (а такое случается практически в ста процентах случаев), то возможно увеличение времени выполнения R-кода. Некоторую вариативность результатов можно увидеть, даже если выполнить функцию {{Inline-code|system.time()|lang="rsplus"}} несколько раз подряд. Подобной неточности оценки можно избежать путём многократного повторения выполняемых выражений и вычислением среднего времени, что позволит сгладить часть вариаций.
Проиллюстрируем вышесказанное на примере:
</syntaxhighlight>
В этом примере с помощью функции {{Inline-code|replicate()|lang="rsplus"}} мы повторили выражение {{Inline-code|system.time(mean(x))|lang="rsplus"}} 10 раз, отфильтровав вывод функции {{Inline-code|system.time()|lang="rsplus"}} так, чтобы нам выводилось только время выполнения команды, дописав {{Inline-code|[["elapsed"]]|lang="rsplus"}}. Как мы видим, время выполнения при повторном выполнении выражения может отличаться.
Базовый пакет позволяет реализовать процедуру многократного повторения выражения функции как минимум двумя способами. Первый - функция {{Inline-code|replicate()|lang="rsplus"}}. Приведенное выше сопоставление времени выполнения двух выражений при использовании функции {{Inline-code|replicate()|lang="rsplus"}} будет выглядеть следующим образом:
<syntaxhighlight lang="rsplus">
</syntaxhighlight>
Тот же самый эффект можно получить и с помощью обычного цикла {{Inline-code|for()|lang="rsplus"}}:
<syntaxhighlight lang="rsplus">
</syntaxhighlight>
Можно также использовать описательные статистики в сочетании с множественными повторениями: <syntaxhighlight lang="rsplus">> median(replicate(100, system.time(mean(x))[["elapsed"]]))[1] 0.021</syntaxhighlight> В примере выше мы взяли только значения {{Inline-code|elapsed|lang="rsplus"}} и рассчитали медиану <ref>Медиана является более устойчивой мерой центральной тенденции при асимметрии распределения, что, как правило, характерно для измерения времени.</ref>. Вместо подобных решений можно использовать специальные пакеты, предназначенные для измерения производительности кода, в частности, пакеты {{Inline-code|rbenchmark|lang="rsplus"}} и {{Inline-code|microbenchmark|lang="rsplus"}}. Основной принцип работы этих пакетов заключается в многократном выполнении выражений и расчёта ряда интегральных показателей, в частности, суммы, среднего значения или медианы времени выполнения всех попыток.
== Пакет rbenchmark ==

Навигация