一些参考资料:
这是对这个问题的跟进为什么处理排序数组比处理未排序数组快?
我在 r 标签中找到唯一一篇与分支预测有关的帖子是这个为什么采样矩阵行很慢?。
问题的解释:
我正在研究处理已排序数组是否比处理未排序数组更快(与 Java
和 C
中测试的问题相同-第一个链接),以查看分支预测是否以相同方式影响 R
。
请参见以下基准示例:
set.seed(128)
#or making a vector with 1e7
myvec <- rnorm(1e8, 128, 128)
myvecsorted <- sort(myvec)
mysumU = 0
mysumS = 0
SvU <- microbenchmark::microbenchmark(
Unsorted = for (i in 1:length(myvec)) {
if (myvec[i] > 128) {
mysumU = mysumU + myvec[i]
}
} ,
Sorted = for (i in 1:length(myvecsorted)) {
if (myvecsorted[i] > 128) {
mysumS = mysumS + myvecsorted[i]
}
} ,
times = 10)
ggplot2::autoplot(SvU)
问题:
- 首先,我想知道为什么"Sorted"向量并不总是最快的,而且与
Java
中表达的幅度不同? - 其次,为什么排序后的执行时间与未排序的执行时间相比具有更高的变化性?
N.B. 我的CPU是。
更新:
为了调查变异部分,我使用了100百万元素(n=1e8
)的向量进行了microbenchmark
,并重复了100次基准测试(times=100
)。这是与该基准测试相关联的图。
sessioninfo
:R version 3.6.1 (2019-07-05)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 16299)
Matrix products: default
locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C LC_TIME=English_United States.1252
attached base packages:
[1] compiler stats graphics grDevices utils datasets methods base
other attached packages:
[1] rstudioapi_0.10 reprex_0.3.0 cli_1.1.0 pkgconfig_2.0.3 evaluate_0.14 rlang_0.4.0
[7] Rcpp_1.0.2 microbenchmark_1.4-7 ggplot2_3.2.1
1.
评估 R 语言的设计2.
在 R 中实现持久 O(1) 栈和队列3.
R 的字节码编译器 - M--compiler::enableJIT(0)
之后,您应该重新检查基准测试。 - Roland