Изменения

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

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

910 байтов добавлено, 10:02, 23 января 2014
м
Нет описания правки
> x <- rnorm(10^7L)
> system.time(mean(x))
пользователь система прошло 0.020 0.000 0.022023
> system.time(sum(x) / length(x))
пользователь система прошло 0.013 0.000 0.013012
</syntaxhighlight>
<syntaxhighlight lang="rsplus">
> replicate(10, system.time(mean(x))[["elapsed"]])
[1] 0.023 024 0.021 020 0.021 019 0.021 018 0.022 017 0.021 016 0.022 015 0.021 015 0.021 015 0.021015
</syntaxhighlight>
> system.time(replicate(100, mean(x)))
пользователь система прошло
21.166 580 0.000 21.162586
> system.time(replicate(100, sum(x) / length(x)))
пользователь система прошло
10.167 817 0.003 016 10.186835
</syntaxhighlight>
> system.time(for (i in seq_len(100)) mean(x))
пользователь система прошло
21.110 583 0.003 000 21.126590
> system.time(for (i in seq_len(100)) sum(x) / length(x))
пользователь система прошло
10.070 797 0.000 10.085800
</syntaxhighlight>
<syntaxhighlight lang="rsplus">
> median(replicate(100, system.time(mean(x))[["elapsed"]]))
[1] 0.0210155
</syntaxhighlight>
<syntaxhighlight lang="rsplus">
CMApply colMeanApply <- function(x) {
apply(x, 2, mean)
}
CMVapply colMeansVapply <- function(x) {
vapply(seq_len(ncol(x)), function(i) mean(x[, i]), FUN.VALUE = numeric(1))
}
CMLoop colMeansLoop <- function(x) {
n.vars <- ncol(x)
res <- double(n.vars)
}
CMLoopVec colMeansLoopVec <- function(x) {
n.vars <- ncol(x)
n <- nrow(x)
<syntaxhighlight lang="rsplus">
> identical(CMApplycolMeanApply(x), CMVapplycolMeansVapply(x), CMLoopcolMeansLoop(x), CMLoopVeccolMeansLoopVec(x), ColMeanscolMeans(x))[1] TRUE
</syntaxhighlight>
<syntaxhighlight lang="rsplus">
> library(rbenchmark)
> benchmark(CMApplycolMeanApply(x), CMVapplycolMeansVapply(x), CMLoopcolMeansLoop(x), CMLoopVec+ colMeansLoopVec(x), ColMeanscolMeans(x), replications = 100) test replications elapsed relative user.self sys.self user.child sys.child1 colMeanApply(x) 100 13.206 16.802 11.893 1.260 0 04 colMeansLoopVec(x) 100 6.931 8.818 6.793 0.113 0 03 colMeansLoop(x) 100 7.729 9.833 7.583 0.113 0 02 colMeansVapply(x) 100 7.724 9.827 7.630 0.067 0 05 colMeans(x) 100 0.786 1.000 0.784 0.000 0 0
</syntaxhighlight>
Наиболее важны для нас в выводе функции {{Inline-code|benchmark()|lang="rsplus"}} столбцы elapsed и relative. Столбец elapsed показывает время, затраченное на выполнение интересующей нас функции. Как видим из примера, самыми медленными оказались функции {{Inline-code|CMApplycolMeanApply()|lang="rsplus"}} и {{Inline-code|CMLoopcolMeansLoop()|lang="rsplus"}}, а самой быстрой {{Inline-code|ColMeanscolMeans()|lang="rsplus"}}, причём превосходит остальные по скорости выполнения как минимум в 7 раз.
Показатель relative дает информацию о разнице во времени относительно самого быстрого выражения (в нашем случае это {{Inline-code|ColMeans()|lang="rsplus"}}), т.е. время самого быстрого выражения берётся за единицу, и рассчитывается относительное время для остальных выражений.
<syntaxhighlight lang="rsplus">
> benchmark(CMApplycolMeanApply(x), CMVapplycolMeansVapply(x), CMLoopcolMeansLoop(x), CMLoopVeccolMeansLoopVec(x), ColMeanscolMeans(x), + replications = 100, order = "relative", + columns = c("test", "replications", "elapsed", "relative"))5 colMeans(x) 100 0.782 1.0004 colMeansLoopVec(x) 100 6.890 8.8113 colMeansLoop(x) 100 7.684 9.8262 colMeansVapply(x) 100 7.716 9.8671 colMeanApply(x) 100 13.142 16.806
</syntaxhighlight>

Навигация