Глобальное окружение против библиотечных функций - PullRequest
0 голосов
/ 19 декабря 2018

Моя цель - оптимизировать функции, которые будут выполняться несколько тысяч раз в будущем.

Вопрос в том, что если наша единственная цель - время выполнения, лучше ли хранить наши собственные функции в пакете илипустить их в глобальную среду?Или это ничего не меняет?

В качестве первой мысли я сравнил время работы функции 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%, если число повторений мало, и немного медленнее, если оно велико).

Возможно получитьнадежное правило о хранении функций (независимо от количества итераций и сложности функции)?

...