Лучшая емкость списка для известного дистрибутива

Существует ли лучший алгоритм для определения емкости списка С# в конструкторе, если известно общее распределение возможных размеров?

В качестве конкретного примера, если количество значений, которые должны быть помещены в каждый список, имеет среднее значение 500 и стандартное отклонение 50 с приблизительно нормальным распределением, какова наилучшая начальная емкость для списка с точки зрения потребления памяти?


person MonkeyPushButton    schedule 14.10.2011    source источник


Ответы (5)


Оставьте список, чтобы решить. Я бы не стал устанавливать его (просто используйте пустой конструктор), если только у вас не возникнут конкретные проблемы с производительностью, и в этот момент, вероятно, есть другие вещи, которые вы можете исправить в первую очередь.

Преждевременная оптимизация — корень всех зол.

person Deleted    schedule 14.10.2011

Это личное мнение, а не основанное на исследованиях, но помните, что сам список содержит только ссылку на каждый объект, и поэтому, вероятно, лучше немного ошибиться, выделив место и для нескольких объектов. много ссылок, а не случайное удвоение количества ссылок, которые вам нужны. Имея это в виду, полные два или даже три дополнительных стандартных отклонения (600 или 650), вероятно, не выходят за рамки нормы. Но, опять же, это мое мнение, а не результат исследования.

person Joel Coehoorn    schedule 14.10.2011

Если вы придерживаетесь правила трех сигм, http://en.wikipedia.org/wiki/68-95-99.7_rule указывает, что если учесть 3 стандартных отклонения, одна выборка будет находиться в пределах этого диапазона в 99,7% случаев.

person Matthew    schedule 14.10.2011
comment
Это предполагает нормальное распределение. А если его данные нормальный дист. тогда на самом деле это будет 99,85%, поскольку подойдет все, что меньше емкости (например, если размер данных средний - 7 стандартных разработчиков, он все равно будет соответствовать его списку). - person Dylan Smith; 14.10.2011
comment
Да, в вопросе они утверждают, что это примерно нормальное распределение. - person Matthew; 14.10.2011

Я провел небольшое исследование, и кажется, что на этот вопрос есть «правильный» ответ.

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

График, показывающий потери памяти в зависимости от емкости для различных стандартных отклонений.

Приведенный выше график был сгенерирован в Excel с использованием нормального распределения и тестирования пространства, чрезмерно используемого различными объемами начального списка, с использованием 10 000 образцов и среднего значения 10 000. Как видите, у него есть несколько интересных особенностей.

  1. Для низких стандартных отклонений выбор плохой начальной емкости может привести к трате до восьми раз больше места, чем при лучшем выборе.
  2. При высоких стандартных отклонениях относительно среднего возможна меньшая экономия.
  3. Впадины, соответствующие наименьшей потере памяти, возникают в точках, зависящих от стандартного отклонения.
  4. Лучше выбирать значение из правой половины графика, чтобы избежать перераспределения списка.
  5. Я не смог найти точную формулу для минимальных потерь, но среднее значение + 1,75 x стандартное отклонение кажется лучшим выбором на основе этого анализа.

Предостережение: YMMV с другими дистрибутивами, средствами и т. д.

person Community    schedule 15.10.2011

Нет правильного ответа. Это будет компромисс между использованием памяти и процессором. Чем больше вы инициализируете список, тем больше памяти вы, вероятно, тратите впустую, но экономите ЦП, поскольку его не нужно снова изменять позже.

person Dylan Smith    schedule 14.10.2011