Петля внутри против внешней функции - PullRequest
0 голосов
/ 30 декабря 2018

Из этого поста 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)

benchmarking2

Как можно видеть, существует резкое различие в эффективности.Что является основной причиной этого?

Чтобы было понятно, вопрос не в задаче, решаемой с помощью приведенного выше кода (что можно было бы сделать более элегантно), а просто в расхождении эффективности между регулярным циклом ицикл, заключенный в функцию.

1 Ответ

0 голосов
/ 30 декабря 2018

Объяснение состоит в том, что функции компилируются «точно в срок», а интерпретируемый код - нет.См. ?compiler::enableJIT для описания.

Если вы хотите продемонстрировать разницу, запустите

compiler::enableJIT(0)

перед любым кодом (, включая , создание функции for_loop).Это отключает JIT-компиляцию до конца этого сеанса.Тогда время будет гораздо более похожим для двух наборов кода.

Это необходимо сделать до создания функции for_loop, поскольку после компиляции JIT-компилятором она останется скомпилированной независимо от того, включен JIT или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...