为什么预先分配输出容器会增加运行时间?

时间:2019-12-02 19:15:02

标签: r iteration microbenchmark

我最近在Hadley Wickham的“ advanced R”中读到,应该预先分配输出容器以减少迭代过程的运行时间。这对我来说很有意义,因为它减少了开销。出于好奇,我想看看这在一个简单的示例中有什么不同,因此我决定比较一个简单的循环:

指定长度和类型:

library(benchmark)
# Vector initialized with length and type
h <- vector(mode = "integer", length = 1000000)
#benchmark simple for loop
g <- benchmark(
for(i in 1:1000000){
  h[i] <- i
}, replications = 1000)
paste("runtime:", g[1, 3], "seconds.")
[1] "runtime: 52 seconds."

空向量c()

l <- c()
f <- benchmark(
  for(i in 1:1000000){
    l[i] <- i
}, replications = 1000)
paste("runtime:", f[1, 3], "seconds")
[1] "runtime: 51.3400000000001 seconds"

空向量NULL

o <- NULL
n <- benchmark(
  for(i in 1:1000000){
    o[i] <- i
  }, replications = 1000)
paste("runtime:", n[1, 3], "seconds")
[1] "runtime: 52.3500000000004 seconds"

正如人们所看到的,在空存储向量方面存在很小的差异(有趣的是,NULLc()之间也存在差异)。因此,我的问题是为什么提供附加信息(例如向量的大小和要存储的对象的类型)不会减少,但看似增加了(不确定差异是否实际上是重要的)运行时间?


注意:我确保在所有基准测试期间,没有后台进程消耗任何处理能力。

0 个答案:

没有答案