R:Измерение времени выполнения выражений
Для измерения времени выполнения выражений используют следующие инструменты:
- Функция Шаблон:Inline-code из базового пакета;
- Cпециализированные функции (benchmarks, бенчмарки);
- Функция профилирования времени выполнения кода Шаблон:Inline-code.
Функция system.time()
Самый простой инструмент для измерения времени выполнения кода - функция Шаблон:Inline-code из пакета Шаблон:Inline-code. В качестве аргумента функция Шаблон:Inline-code принимает выражения и возвращает время выполнения данного выражения. Измерим время выполнения функции Шаблон:Inline-code, которая останавливает выполнение кода на заданный интервал времени (в секундах):
<syntaxhighlight lang="rsplus"> system.time(Sys.sleep(1)) </syntaxhighlight>
Как видим, на выполнение данной операции заняло ровно одну секунду.
Приведём ещё один пример. Сравним время вычисления встроенной в R функции (Шаблон:Inline-code) и среднего, вычисленного по формуле [math]\frac{1}{n}\sum_{i=1}^{n}x_{i}[/math]. на сгенерированном массиве нормально распределенных значений:
<syntaxhighlight lang="rsplus"> nvec <- rnorm(10^7L) </syntaxhighlight>
<syntaxhighlight lang="rsplus"> system.time(mean(nvec)) system.time(sum(nvec) / length(nvec)) </syntaxhighlight>
Функция возвращает 3 значения:
- Шаблон:Inline-code - время CPU, которое занял пользователь;
- Шаблон:Inline-code - время CPU, которое заняла система;
- Шаблон:Inline-code - реальное время, которое заняло выполнение команды.
\end{itemize}
Соответственно, в выводе функции нас интересует значение Шаблон:Inline-code, который показывает время выполнения функции (выражения) в секундах. Как мы видим, внешне более сложное выражение Шаблон:Inline-code выполняется быстрее стандартной функции Шаблон:Inline-code.
К сожалению, подобный способ достаточно ненадежен, так как для оценки времени выполнения выражения функция Шаблон:Inline-code обращается к системным значениям времени. Следовательно, если во время выполнения кода параллельно производятся и другие операции на компьютере (а такое случается практически в ста процентах случаев), то возможно увеличение времени выполнения R-кода. Некоторую вариативность результатов можно увидеть, даже если выполнить функцию Шаблон:Inline-code несколько раз подряд. Подобной неточности оценки можно избежать путём многократного повторения выполняемых выражений и вычислением среднего времени, что позволит сгладить часть вариаций.
Базоый пакет позволяет реализовать процедуру многократного повторения выражения функции как минимум двумя способами. Первый - функция Шаблон:Inline-code. Приведенное выше сопоставление времени выполнения двух выражений при использовании функции Шаблон:Inline-code будет выглядеть следующим образом:
<syntaxhighlight lang="rsplus"> system.time(replicate(100, mean(nvec))) system.time(replicate(100, sum(nvec) / length(nvec))) </syntaxhighlight>
Тот же самый эффект можно получить и с помощью обычного цикла Шаблон:Inline-code:
<syntaxhighlight lang="rsplus"> system.time({
for (i in seq_len(100)) mean(nvec)
}) system.time({
for (i in seq_len(100)) sum(nvec) / length(nvec)
}) </syntaxhighlight>
Можно также использовать описательные статистики в сочетании с множественными повторениями:
<syntaxhighlight lang="rsplus"> median(system.time(replicate(100, mean(nvec)))"elapsed") </syntaxhighlight>
В примере выше мы взяли только значения Шаблон:Inline-code и рассчитали медиану [1].
Вместо подобных решений можно использовать специальные пакеты, предназначенные для измерения производительности кода, в частности, пакеты Шаблон:Inline-code и Шаблон:Inline-code. Основной принцип работы этих пакетов заключается в многократном выполнении выражений и расчёта ряда интегральных показателей, в частности, суммы, среднего значения или медианы времени выполнения всех попыток.
Пакет rbenchmark
Пакет microbenchmark
Примечания
- ↑ Медиана является более устойчивой мерой центральной тенденции при асимметрии распределения, что, как правило, характерно для измерения времени.