Почему повторение, пока и для такого медленного запуска? - PullRequest
4 голосов
/ 06 мая 2020

Я делал некоторые оптимизации кода, где кажется, что конструкции repeat, while и for, похоже, имеют довольно много накладных расходов при запуске. Вот пример:

microbenchmark::microbenchmark(
  {lapply(1:10, function(x) x)},
  {i <- 0; while (i < 10) i <- i + 1},
  {for (i in 1:10) i},
  {i <- 0; repeat if ((i <- i + 1) >= 10) break}
, times = 1000)
Unit: microseconds
                                            expr    min      lq     mean  median     uq      max neval
                 { lapply(1:10, function(x) x) }    7.4   12.80   15.101   14.30   15.5    919.9  1000
           { i <- 0; while (i < 10) i <- i + 1 } 1377.8 1431.85 1830.941 1475.10 1537.1  68344.9  1000
                           { for (i in 1:10) i }  838.0  880.00 1008.845  904.45  950.6  56744.9  1000
{ i <- 0; repeat if ((i <- i + 1) >= 10) break } 2092.4 2190.05 3265.421 2248.45 2343.2 467666.1  1000

Если вы используете эти конструкции много раз (например, во внешнем l oop), 100-кратное медленнее в сумме значительно увеличивает!

Это кажется противоречащим моему вера (и многих других ). Я что-то упустил?

Изменить: , поскольку я не видел никакого эффекта в моем реальном коде, заставило меня задуматься ...

f <- function(x) { i <- 0; repeat if ((i <- i + 1) >= x) break }
microbenchmark::microbenchmark(
  f(10L)  
, times = 1000)
Unit: nanoseconds
   expr min  lq  mean median  uq   max neval
 f(10L) 700 800 898.9    900 900 10700  1000

Обратите внимание на наносекунды ! Это время, которое я ожидаю от этих конструкций (например, в основном накладные расходы из-за <-, + и >=). Так вроде проблема с microbenchmark?

> sessionInfo()
R version 3.6.1 (2019-07-05)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
...