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

Материал Psylab.info - энциклопедии психодиагностики
Перейти к: навигация, поиск
м (Функция system.time())
м (Функция system.time())
Строка 46: Строка 46:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
В этом примере с помощью функции {{Inline-code|replicate()|lang=rsplus}} мы повторили выражение {{Inline-code|system.time(mean(x))[["elapsed"]]|lang=rsplus}} 10 раз, отфильтровав вывод функции {{Inline-code|system.time()|lang=rsplus}} так, чтобы нам выводилось только время выполнения команды. Как мы видим, время выполнения при повторном выполнении выражения может отличаться.
+
В этом примере с помощью функции {{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}} будет выглядеть следующим образом:
 
Базовый пакет позволяет реализовать процедуру многократного повторения выражения функции как минимум двумя способами. Первый - функция {{Inline-code|replicate()|lang=rsplus}}. Приведенное выше сопоставление времени выполнения двух выражений при использовании функции {{Inline-code|replicate()|lang=rsplus}} будет выглядеть следующим образом:

Версия 19:24, 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)) пользователь система прошло

      0.003        0.004        1.000

</syntaxhighlight>

Как видим, на выполнение данной операции заняло ровно одну секунду.

Приведём ещё один пример. Сравним время вычисления встроенной в R функции (Шаблон:Inline-code) и среднего, вычисленного по формуле [math]\frac{1}{n}\sum_{i=1}^{n}x_{i}[/math]. на сгенерированном массиве нормально распределенных значений:

<syntaxhighlight lang="rsplus"> > x <- rnorm(10^7L) > system.time(mean(x)) пользователь система прошло

      0.020        0.000        0.022

> system.time(sum(x) / length(x)) пользователь система прошло

      0.013        0.000        0.013

</syntaxhighlight>

Функция возвращает 3 значения:

Соответственно, в выводе функции нас интересует значение Шаблон:Inline-code, который показывает время выполнения функции (выражения) в секундах. Как мы видим, внешне более сложное выражение Шаблон:Inline-code выполняется быстрее стандартной функции Шаблон:Inline-code.

К сожалению, подобный способ достаточно ненадежен, так как для оценки времени выполнения выражения функция Шаблон:Inline-code обращается к системным значениям времени. Следовательно, если во время выполнения кода параллельно производятся и другие операции на компьютере (а такое случается практически в ста процентах случаев), то возможно увеличение времени выполнения R-кода. Некоторую вариативность результатов можно увидеть, даже если выполнить функцию Шаблон:Inline-code несколько раз подряд. Подобной неточности оценки можно избежать путём многократного повторения выполняемых выражений и вычислением среднего времени, что позволит сгладить часть вариаций.

Проиллюстрируем вышесказанное на примере:

<syntaxhighlight lang="rsplus"> > replicate(10, system.time(mean(x))"elapsed")

[1] 0.023 0.021 0.021 0.021 0.022 0.021 0.022 0.021 0.021 0.021

</syntaxhighlight>

В этом примере с помощью функции Шаблон:Inline-code мы повторили выражение Шаблон:Inline-code 10 раз, отфильтровав вывод функции Шаблон:Inline-code так, чтобы нам выводилось только время выполнения команды, дописав Шаблон:Inline-code. Как мы видим, время выполнения при повторном выполнении выражения может отличаться.

Базовый пакет позволяет реализовать процедуру многократного повторения выражения функции как минимум двумя способами. Первый - функция Шаблон:Inline-code. Приведенное выше сопоставление времени выполнения двух выражений при использовании функции Шаблон:Inline-code будет выглядеть следующим образом:

<syntaxhighlight lang="rsplus"> > system.time(replicate(100, mean(x))) пользователь система прошло

      2.166        0.000        2.162

> system.time(replicate(100, sum(x) / length(x))) пользователь система прошло

      1.167        0.003        1.186

</syntaxhighlight>

Тот же самый эффект можно получить и с помощью обычного цикла Шаблон:Inline-code:

<syntaxhighlight lang="rsplus"> > system.time(for (i in seq_len(100)) mean(x)) пользователь система прошло

      2.110        0.003        2.126

> system.time(for (i in seq_len(100)) sum(x) / length(x)) пользователь система прошло

      1.070        0.000        1.085

</syntaxhighlight>

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

Пакет rbenchmark

Пакет microbenchmark

Примечания