为什么rev()比相反顺序的索引慢?

时间:2018-07-04 00:44:09

标签: r optimization

我想知道rev为何比反向索引慢10倍。

> a <- rnorm(100)
> microbenchmark::microbenchmark(a[length(a):1], rev(a))
Unit: microseconds
           expr    min      lq     mean median     uq     max neval cld
 a[length(a):1]  1.590  1.7620  1.98496  1.968  2.099   3.708   100  a 
         rev(a) 10.885 11.6075 14.46583 11.860 12.126 176.827   100   b

在某些情况下,rev是最佳解决方案吗?

编辑:避免S3调度几乎完全消除了速度差异。

> microbenchmark::microbenchmark(a[length(a):1], rev(a), rev.default(a))
Unit: microseconds
           expr    min      lq     mean  median      uq     max neval cld
 a[length(a):1]  1.764  1.9970  2.26030  2.2065  2.4115   4.112   100  a 
         rev(a) 11.325 12.1815 14.07172 12.4890 12.9110 128.009   100   b
 rev.default(a)  2.155  2.5205  2.87756  2.6870  2.8565  22.553   100  a 

编辑2:实际上,在大型向量上,调度开销可以忽略不计

> a <- rnorm(1e6)
> microbenchmark::microbenchmark(a[length(a):1], rev(a), rev.default(a))
Unit: milliseconds
           expr      min       lq     mean   median        uq      max neval cld
 a[length(a):1] 6.572286 7.044723 25.73596 8.401815  9.443036 263.6888   100   a
         rev(a) 6.655199 8.189631 40.73245 8.647586 10.015620 262.7886   100   a
 rev.default(a) 6.531415 8.203819 28.39852 8.495920  9.755701 268.0045   100   a

0 个答案:

没有答案