Худший грех: побочные эффекты или передача крупных объектов?

Простой способ:

Math.Ceiling(decimal.Parse(yourNumber + ""));
5
задан smci 28 April 2016 в 13:21
поделиться

7 ответов

Помните свой Knuth. "Преждевременная оптимизация является корнем всего зла программирования".

Попробуйте бесплатную версию побочного эффекта. Посмотрите, удовлетворяет ли это Вашим целям производительности. Если это делает, большой, у Вас нет проблемы во-первых; если это не делает, то используйте побочные эффекты и запишите для следующего программиста, что Ваша рука была вызвана.

6
ответ дан 18 December 2019 в 07:58
поделиться

используйте переменные во внешней функции вместо глобальных переменных. Это получает Вас лучший из обоих подходов: Вы не видоизменяете глобальное состояние, и Вы не копируете большой комок данных. Если необходимо выйти рано, просто возвратите частичные результаты.

(См. раздел "Scope" в руководстве R: http://cran.r-project.org/doc/manuals/R-intro.html#Scope)

9
ответ дан 18 December 2019 в 07:58
поделиться

К вашему сведению вот полное демонстрационное игрушечное решение, которое избегает побочных эффектов:

outerfunc <- function(names) {
  templist <- list()
  for (aname in names) {
    templist[[aname]] <- innerfunc(aname)
  }
  templist
}

innerfunc <- function(aname) {
  retval <- NULL
  if ("one" %in% aname) retval <- c(1)
  if ("two" %in% aname) retval <- c(1,2)
  if ("three" %in% aname) retval <- c(1,2,3)
  retval
}

names <- c("one","two","three")

name_vals <- outerfunc(names)

for (name in names) assign(name, name_vals[[name]])
1
ответ дан 18 December 2019 в 07:58
поделиться

Это не будет иметь много значения к использованию памяти, таким образом, Вы могли бы также сделать код чистым.

Так как R имеет copy-modify для переменных, изменение глобального объекта будет иметь те же последствия памяти как отказывание, что-то в ответ оценивает.

Если Вы храните выводы в базе данных (или даже в файле) у Вас не будет проблем использования памяти, и данные будут инкрементно доступны, поскольку они создаются, а не только в конце. Быстрее ли это с базой данных, зависит, прежде всего, от того, сколько памяти Вы используете: сокращение, сборка "мусора", собирающаяся заплатить за стоимость записи в диск.

Существуют и время и профилировщики памяти в R, таким образом, Вы видите опытным путем, каково влияние.

4
ответ дан 18 December 2019 в 07:58
поделиться

Я не уверен, что понимаю вопрос, но у меня есть несколько решений.

  1. В функции создайте список векторов и возврата это.

  2. В функции создайте среду и сохраните все векторы в этом. Просто удостоверьтесь, что Вы возвращаете среду в случае ошибок.

в R:

help(environment)

# You might do something like this:

outer <- function(datasets) {
  # create the return environment
  ret.env <- new.env()
  for(set in dataset) {
    tmp <- inner(set)
    # check for errors however you like here.  You might have inner return a list, and
    # have the list contain an error component
    assign(set, tmp, envir=ret.env)
  }
  return(ret.env)
}

#The inner function might be defined like this

inner <- function(dataset) {
  # I don't know what you are doing here, but lets pretend you are reading a data file
  # that is named by dataset
  filedata <- read.table(dataset, header=T)
  return(filedata)
}

leif

1
ответ дан 18 December 2019 в 07:58
поделиться

Третий подход: внутренняя функция возвращает ссылку на большой массив, который следующий оператор в цикле затем разыменовывает и хранит везде, где этому было нужно (идеально с единственным хранилищем указателя а не при необходимости к memcopy целый массив).

Это избавляется и от побочного эффекта и от передачи большого datastructures.

0
ответ дан 18 December 2019 в 07:58
поделиться

Трудно сказать окончательно, не зная используемый язык/компилятор. Однако, если можно просто передать указатель/ссылку на объект, который Вы создаете, затем размер самого объекта не имеет никакого отношения к скорости вызовов функции. Управление этими данными в будущем могло быть другой историей.

-1
ответ дан 18 December 2019 в 07:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: