全局环境与库函数的运行时间

时间:2018-12-19 15:35:00

标签: r performance libraries

我的目标是优化将来将运行数千次的功能。

问题是,假设我们的唯一目标是运行时间,那么将我们自己的函数存储在包中还是让它们放在全局环境中会更好吗?还是没关系?

首先想到的是,我比较了rm函数和下面的个人函数的运行时间:

own_rm <- function (..., list = character(), pos = -1, envir = as.environment(pos), 
                    inherits = FALSE) 
{
  dots <- match.call(expand.dots = FALSE)$...
  if (length(dots) && !all(vapply(dots, function(x) is.symbol(x) || 
                                  is.character(x), NA, USE.NAMES = FALSE))) 
    stop("... must contain names or character strings")
  names <- vapply(dots, as.character, "")
  if (length(names) == 0L) 
    names <- character()
  list <- .Primitive("c")(list, names)
  .Internal(remove(list, envir, inherits))
}

这两个函数或相同的rm包都在base包中,own_rm放在全局环境中。

我已经尝试了一个基准进行比较:

library(rbenchmark)

benchmark("base" = {
  a <- c()
  rm(a)},
    "glob_env" ={
  a <- c()
  own_rm(a)},
  replications = 1000)

给我这些结果:

      test replications elapsed relative user.self sys.self user.child sys.child
1     base         1000   0.035    1.000     0.036        0          0         0
2 glob_env         1000   0.039    1.114     0.039        0          0         0

通过增加复制数量,差距变得很小。

      test replications elapsed relative user.self sys.self user.child sys.child
1     base       100000   4.150    1.000     4.145    0.003          0         0
2 glob_env       100000   4.238    1.021     4.237    0.000          0         0

为了提高结果的吸引力,我创建了一个仅包含“ Hello world”函数的程序包,然后再次尝试提供给我相反结果的基准(即,如果复制次数为,则全局env函数的速度似乎提高了15%)低,如果高则慢一点。

是否有一个关于函数存储的鲁棒规则(无论迭代次数和函数的复杂性如何)?

0 个答案:

没有答案