为什么repeat、while和for启动这么慢?

问题描述 投票:3回答:1

我在做一些代码优化,在这里好像是在做 repeat, whilefor 构造在启动时似乎有一些开销。下面是一个例子。

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)
r performance loops microbenchmark
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.