Я делал некоторые оптимизации кода, где кажется, что конструкции 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)