&从 R 4.2.0 到 R 4.3.1 的性能差异(惰性评估)

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

下面的代码在给定相反条件的情况下对 & 运算进行了基准测试,这些条件是否受益于向量中的惰性求值条件。

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)
]

r lazy-evaluation logical-and
1个回答
0
投票

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)
© www.soinside.com 2019 - 2024. All rights reserved.