Из этого поста SO возникла дискуссия по поводу сравнительного анализа различных решений.Рассмотрим следующий код
# global environment is empty - new session just started
# set up
set.seed(20181231)
n <- sample(10^3:10^4,10^3)
for_loop <- function(n) {
out <- integer(length(n))
for(k in 1:length(out)) {
if((k %% 2) == 0){
out[k] <- 0L
next
}
out[k] <- 1L
next
}
out
}
# benchmarking
res <- microbenchmark::microbenchmark(
for_loop = {
out <- integer(length(n))
for(k in 1:length(out)) {
if((k %% 2) == 0){
out[k] <- 0L
next
}
out[k] <- 1L
next
}
out
},
for_loop(n),
times = 10^4
)
Вот результаты сравнительного анализа для тех же самых циклов, один упакован в функцию, другой нет
# Unit: microseconds
# expr min lq mean median uq max neval cld
# for_loop 3216.773 3615.360 4120.3772 3759.771 4261.377 34388.95 10000 b
# for_loop(n) 162.280 180.149 225.8061 190.724 211.875 26991.58 10000 a
ggplot2::autoplot(res)
Как можно видеть, существует резкое различие в эффективности.Что является основной причиной этого?
Чтобы было понятно, вопрос не в задаче, решаемой с помощью приведенного выше кода (что можно было бы сделать более элегантно), а просто в расхождении эффективности между регулярным циклом ицикл, заключенный в функцию.