Изменения

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

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

7817 байтов добавлено, 10:47, 23 января 2014
м
Пакет microbenchmark
== Пакет microbenchmark ==
 
Функция {{Inline-code|microbenchmark()|lang="rsplus"}} одноименного пакета работает сходным с функцией {{Inline-code|benchmark()|lang="rsplus"}} образом, но предоставляет более гибкие средства по управлению процессом выполнения выражений<ref>Но в отличии от функции benchmark() использует собственную реализацию измерения времени выполнения и организацию повторных испытаний.</ref>. Также с помощью функции {{Inline-code|microbenchmark()|lang="rsplus"}} можно получить исходную информацию о времени выполнения каждой попытки, что даёт достаточно широкие возможности по обработке и анализу полученных результатов. В таблице ниже представлено время выполнения пяти функций вычисления среднего значения из предыдущего примера, полученное с помощью функции {{Inline-code|microbenchmark()|lang="rsplus"}}:
 
<syntaxhighlight lang="rsplus">
> library(microbenchmark)
> res <- microbenchmark(colMeansApply(x), colMeansVapply(x), colMeansLoop(x),
+ colMeansLoopVec(x), colMeans(x), times = 100)
> print(res, unit = "ms", order = "median")
Unit: milliseconds
expr min lq median uq max neval
colMeans(x) 7.796 7.828 7.87 7.943 8.063 100
colMeansLoopVec(x) 67.495 68.524 75.11 81.684 101.999 100
colMeansVapply(x) 75.791 76.648 85.47 90.325 94.803 100
colMeansLoop(x) 75.632 76.920 85.65 90.346 99.707 100
colMeansApply(x) 102.908 127.148 132.24 136.095 144.833 100
</syntaxhighlight>
 
Все результаты представлены в виде описательных статистик, рассчитанных из времени выполнения каждой попытки. Наиболее информативный столбец - это столбец median, который показывает медиану времени выполнения выражения для всех попыток.
 
Вся полученная информация о попытках применения функций вычисления средних записана в отдельную переменную {{Inline-code|res|lang="rsplus"}}. С помощью функции {{Inline-code|str()|lang="rsplus"}} можно увидеть структуру переменной:
 
<syntaxhighlight lang="rsplus">
> str(res)
Classes ‘microbenchmark’ and 'data.frame': 500 obs. of 2 variables:
$ expr: Factor w/ 5 levels "colMeansApply(x)",..: 4 2 1 1 1 3 3 5 5 1 ...
$ time: num 1.02e+08 8.55e+07 1.04e+08 1.10e+08 1.29e+08 ...
</syntaxhighlight>
 
Переменная {{Inline-code|res|lang="rsplus"}}, как можно увидеть в выводе функции {{Inline-code|str()|lang="rsplus"}}, представляет собой список (list) и включает в себя две переменные: {{Inline-code|expr|lang="rsplus"}} (выражение) и {{Inline-code|time|lang="rsplus"}} (время выполнения). На основе этой информации и рассчитываются описательные статистики, приведённые в примере применения функции {{Inline-code|microbenchmark()|lang="rsplus"}}. Наличие исходных данных о каждой попытке позволяет самостоятельно выбирать, рассчитывать и сравнивать предпочтитаемые показатели. Например, расчет медианного времени выполнения попытки и общего времени выполнения всех попыток для каждого выражения выглядит следующим образом:
 
<syntaxhighlight lang="rsplus">
> aggregate(time ~ expr, data = res, function(x) median(x) * 10^-6L)
expr time
1 colMeansApply(x) 132.24
2 colMeansVapply(x) 85.47
3 colMeansLoop(x) 85.65
4 colMeansLoopVec(x) 75.11
5 colMeans(x) 7.87
> aggregate(time ~ expr, data = res, function(x) sum(x)* 10^-6L)
expr time
1 colMeansApply(x) 13015.8
2 colMeansVapply(x) 8400.4
3 colMeansLoop(x) 8447.8
4 colMeansLoopVec(x) 7576.8
5 colMeans(x) 788.8
</syntaxhighlight>
 
Умножение на <math>10^{-6}</math> --- это перевод в миллисекунды. Чтобы получить секунды, нужно, соответственно, разделить на <math>10^{-9}</math>.
 
Помимо настройки формата вывода выбора показателей, наличие информации о времени выполнения выражения в каждой попытке позволяет визуализировать результаты оценки времени выполнения выражения. Например, с помощью функции {{Inline-code|autoplot()|lang="rsplus"}} из пакета {{Inline-code|ggplot2|lang="rsplus"}}, можно получить следующий график:
 
<syntaxhighlight lang="rsplus">
> library(ggplot2)
> autoplot(res)
</syntaxhighlight>
 
[[Файл:Microbenchmark-autoplot-colMeans.png|600px|центр]]
 
Ещё один довольно интересный способ графического представления результатов измерения скорости выполнения кода с помощью функции {{Inline-code|qplot()|lang="rsplus"}} представлен ниже:
 
<syntaxhighlight lang="rsplus">
> qplot(y = time, data = res, colour = expr)
</syntaxhighlight>
 
[[Файл:Microbenchmark-dotplot-colMeans.png|600px|центр]]
 
Так же можно, если возникнет необходимость, оценить статистическую значимость различий во времени выполнения выражений. Благодаря тому, что в переменной {{Inline-code|res|lang="rsplus"}} хранятся данные о времени выполнения каждой попытки из заданного числа, становится возможным использование статистических критериев. Выбор критерия - на усмотрение аналитика, в примере ниже использовался параметрический критерий сравнения групп t-Стьюдента с поправкой уровня статистической значимости Холма для множественных сравнений:
 
<syntaxhighlight lang="rsplus">
> pairwise.t.test(res$time, res$expr)
 
Pairwise comparisons using t tests with pooled SD
 
data: res$time and res$expr
 
colMeansApply(x) colMeansVapply(x) colMeansLoop(x) colMeansLoopVec(x)
colMeansVapply(x) <2e-16 - - -
colMeansLoop(x) <2e-16 0.62 - -
colMeansLoopVec(x) <2e-16 <2e-16 <2e-16 -
colMeans(x) <2e-16 <2e-16 <2e-16 <2e-16
 
P value adjustment method: holm
</syntaxhighlight>
== Примечания ==

Навигация