下面的代码在给定相反条件的情况下对 & 运算进行了基准测试,这些条件是否受益于向量中的惰性求值条件。
set.seed(1)
N <- 1e6
V <- runif(N)
v1 <- V > 0.1
v2 <- V > 0.4
v3 <- V > 0.9
mb_res_le <- microbenchmark::microbenchmark(
times = 100, unit = "ms",
v1 & v2 & v3, v3 & v2 & v1
)
ggplot2::autoplot(mb_res_le)
我理解 R 4.2.0 的结果。即,由于惰性评估,对
FALSE
的 LHS 有更多 &
执行速度更快。但我不明白 R 4.3.1 与相同的比较有何不同。
4.2.0 和 4.3.1 之间有几个版本,这可以在中间的某个地方引入,但我在发行说明中找不到任何可以解释这一点的内容。
我对 R 4.3.1 的结果感到惊讶。这就是为什么我尝试了早期版本的 R,我记得能够解释性能差异。
[添加后更新了绘图
set.seed(1)
]
Docker 让我们可以轻松进行比较。我这里碰巧有 R 4.3.1(当前)和 R 4.2.3(上一个发布周期的最终版本)。我只是添加了
install.packages("microbenchmark")
并打印了结果摘要。
然后对于 R 4.3.1:
Unit: milliseconds
expr min lq mean median uq max neval
v1 & v2 & v3 8.815923 9.328674 10.49479 9.990183 11.14268 16.22374 100
v3 & v2 & v1 10.906409 11.338012 12.42658 12.030553 12.90834 18.53381 100
对于 R 4.2.3
Unit: milliseconds
expr min lq mean median uq max neval
v1 & v2 & v3 8.869552 9.362924 10.41865 9.83979 11.12159 14.79225 100
v3 & v2 & v1 10.700630 11.142198 12.26546 11.61229 13.11973 17.68791 100
和基准测试期间的模正态变化似乎相同。
set.seed(1)
N <- 1e6
V <- runif(N)
v1 <- V > 0.1
v2 <- V > 0.4
v3 <- V > 0.9
install.packages("microbenchmark")
mb_res_le <- microbenchmark::microbenchmark(times = 100, unit = "ms", v1 & v2 & v3, v3 & v2 & v1)
print(mb_res_le)
#ggplot2::autoplot(mb_res_le)