我想知道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