从R 4.2.0到R 4.3.1的性能差异(延迟评估)

cvxl0en2  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(200)

下面的代码对&操作进行了基准测试,给出了相反的条件,这些条件是否受益于向量中的惰性求值条件。

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 es分配给&的LHS执行得更快。但是我不明白为什么R4.3.1的情况是相反的,同样的比较。
在4.2.0和4.3.1之间有几个版本,这可能是在两者之间的某个地方引入的,但我在发行说明中找不到任何可以解释这一点的东西。
我对R 4.3.1的结果感到惊讶。这就是为什么我尝试了早期版本的R,我记得能够解释性能差异。
[添加set.seed(1)后更新的图]

g9icjywg

g9icjywg1#

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)

调用

这是4.2.3的一个,4.3.1显然是类似的:

docker run --rm -ti -v $PWD:/mnt -w /mnt rocker/r-base:4.2.3 Rscript question.R

相关问题