我的目标是优化将来将运行数千次的功能。
问题是,假设我们的唯一目标是运行时间,那么将我们自己的函数存储在包中还是让它们放在全局环境中会更好吗?还是没关系?
首先想到的是,我比较了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%)低,如果高则慢一点。
是否有一个关于函数存储的鲁棒规则(无论迭代次数和函数的复杂性如何)?