#c# #list #capacity
#c# #Список #емкость
Вопрос:
Существует ли наилучший алгоритм для определения емкости списка C # в конструкторе, если известно общее распределение возможных размеров?
В качестве конкретного примера, если количество значений, которые должны быть размещены в каждом списке, имеет среднее значение 500 и стандартное отклонение 50 при приблизительно нормальном распределении, какова наилучшая начальная емкость списка с точки зрения потребления памяти?
Ответ №1:
Оставьте список для принятия решения. Я бы не стал его устанавливать (просто используйте пустой конструктор), если у вас не возникнут конкретные проблемы с производительностью, и в этот момент, вероятно, есть другие вещи, которые вы можете исправить в первую очередь.
Предварительная оптимизация — корень всего зла.
Ответ №2:
Это личное мнение, а не основанное на исследованиях, но помните, что сам список содержит только ссылку на каждый объект, и поэтому, вероятно, лучше немного ошибиться, выделив место для слишком большого количества ссылок, а не случайно удвоить количество ссылок, которые вам нужны. Имея это в виду, полные два или даже три дополнительных стандартных отклонения (600 или 650), вероятно, не выходят за рамки. Но, опять же, это мое мнение, а не результат исследования.
Ответ №3:
Если вы придерживаетесь правила трех сигм, http://en.wikipedia.org/wiki/68-95-99.7_rule утверждает, что если вы учитываете 3 стандартных отклонения, то одна выборка будет находиться в пределах этого диапазона в 99,7% случаев.
Комментарии:
1. Это предполагает нормальное распределение. И если его данные представляют собой обычный dist. тогда на самом деле это будет 99,85%, поскольку подойдет все, что меньше capcity (например, если размер данных равен среднему — 7 std для разработчиков, он все равно будет вписываться в его список).
2. Да, в вопросе они указывают, что это примерно нормальное распределение.
Ответ №4:
Я провел небольшое исследование, и кажется, что на этот вопрос есть «правильный» ответ.
Прежде всего, я согласен, что это может быть преждевременной оптимизацией, поэтому профилирование перед принятием решения о переключении имеет важное значение.
Приведенный выше график был сгенерирован в Excel с использованием нормального распределения и тестирования пространства, используемого различными начальными емкостями списка, с использованием 10 000 выборок и среднего значения 10 000. Как вы можете видеть, у него есть несколько интересных функций.
- При низких стандартных отклонениях выбор плохой начальной емкости может в восемь раз превышать пространство наилучшего выбора.
- При больших стандартных отклонениях от среднего значения возможна меньшая экономия.
- Впадины, соответствующие наименьшему расходу памяти, возникают в точках, зависящих от стандартного отклонения.
- Лучше выбирать значение из правой половины графика, чтобы избежать перераспределения списка.
- Я не смог найти точную формулу для минимальных потерь, но среднее значение 1,75 x стандартное отклонение, по-видимому, является лучшим выбором на основе этого анализа.
Предостережение: YMMV с другими дистрибутивами, средствами и т. Д.
Ответ №5:
Правильного ответа нет. Это будет компромисс между использованием памяти и процессором. Чем больше вы инициализируете список, тем больше памяти вы, вероятно, тратите впустую, но экономите процессор, поскольку его не нужно изменять позже.