R:Измерение времени выполнения выражений — различия между версиями

Материал Psylab.info - энциклопедии психодиагностики
Перейти к: навигация, поиск
(Новая страница: «Для измерения времени выполнения выражений используют следующие инструменты: * Функция …»)
 
м (added Category:R using HotCat)
Строка 68: Строка 68:
  
 
== Пакет microbenchmark ==
 
== Пакет microbenchmark ==
 +
 +
[[Категория:R]]

Версия 18:52, 22 января 2014

Для измерения времени выполнения выражений используют следующие инструменты:

  • Функция Шаблон: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 значения:

\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 и рассчитали медиану (Медиана является более устойчивой мерой центральной тенденции при асимметрии распределения, что, как правило, характерно для измерения времени).

Вместо подобных решений можно использовать специальные пакеты, предназначенные для измерения производительности кода, в частности, пакеты Шаблон:Inline-code и Шаблон:Inline-code. Основной принцип работы этих пакетов заключается в многократном выполнении выражений и расчёта ряда интегральных показателей, в частности, суммы, среднего значения или медианы времени выполнения всех попыток.

Пакет rbenchmark

Пакет microbenchmark