我在做一些代码优化,在这里好像是在做 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
如果你多次使用这些构造(例如在一个外循环中),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)