Моя цель - оптимизировать функции, которые будут выполняться несколько тысяч раз в будущем.
Вопрос в том, что если наша единственная цель - время выполнения, лучше ли хранить наши собственные функции в пакете илипустить их в глобальную среду?Или это ничего не меняет?
В качестве первой мысли я сравнил время работы функции 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))
}
Обе функции илиидентичный exept 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%, если число повторений мало, и немного медленнее, если оно велико).
Возможно получитьнадежное правило о хранении функций (независимо от количества итераций и сложности функции)?