Список Java: начальный размер

#java #list #optimization

#java #Список #оптимизация

Вопрос:

Какой способ лучше для инициализации списка Java:

  • new ArrayList<String>(futureSize)

  • new ArrayList<String>(futureSize 1)

(чтобы предотвратить изменение размера списка)

futureSize это будущий размер списка после заполнения.

Примечание: Если вы собираетесь комментировать / отвечать на что-либо о «преждевременной оптимизации …», «вместо этого вам следует …», ПОЖАЛУЙСТА, НЕ ДЕЛАЙТЕ этого. Я ищу ответ на свой вопрос, вот и все.

Комментарии:

1. Если вас беспокоит качество ответа, возможно, вам следует немного подробнее рассказать о вашей настройке. Как вы думаете, почему важно оптимизировать там? Что вы сделали, чтобы прийти к выводу, что инициализация списка является частью проблемы и т.д…

2. @Lukas нет, я не хочу. Если вы спросите, как создать веб-сайт на PHP, зачем вам объяснять, зачем вам нужен веб-сайт, почему на PHP, почему вы хотите, чтобы он был красным или синим или со сверкающими звездочками повсюду. Я просто ищу ответ на этот простой, ясный вопрос…

3. Это вечный вопрос недопонимания на этой платформе … 🙂 Вы тот, кто борется и злится. Вы получили три хороших и правильных ответа на свой вопрос, и вы не хотели слышать ни одного дополнительного слова… Тогда вам лучше заглянуть в код и не обсуждать, потому что, по-видимому, это вас злит… Да будет так 🙂

Ответ №1:

Вы можете видеть из реализации add(E e) и (аналогичные методы)

 public boolean add(E e) {
    ensureCapacity(size   1);
    elementData[size  ] = e;
    return true;
}
  

… что у вас не должно возникнуть проблем (т. Е. размер внутреннего массива не изменяется), если вы используете

 new ArrayList<String>(futureSize)
  

Комментарии:

1. Мне не интересно, столкнусь ли я с проблемами, я просто не хочу, чтобы размер списка изменялся. С помощью приведенного вами кода я могу предположить, что futureSize 1 это лучше, потому что это предотвратит любое изменение размера?

2. Под проблемами я подразумевал изменение размера списка. Когда вы добавляете последний элемент в список, тогда вызывается size == futureSize - 1 at the time ensureCapacity . Таким образом, вы не столкнетесь с проблемами == размер списка не будет изменен

Ответ №2:

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

И если вы это сделали, то гораздо быстрее просто попробовать оба варианта и сравнить результаты.

Комментарии:

1. Я думаю, что в этом случае использование здравого смысла более эффективно, чем настройка значимого нагрузочного теста…

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

3. @Matthieu Фактическими узкими местами в коде, как правило, являются SQL-запросы без индекса, чтение файла и т.д., А не операции Java-кода в памяти, поэтому такого рода микрооптимизация обычно не требуется. Однако вы правы в том, что это оптимизация, которую легко выполнять каждый раз, но, по моему опыту, потеть над этим материалом не стоит. Сосредоточьтесь на написании качественного кода, который можно легко поддерживать и устранять проблемы с производительностью при их возникновении.

4. @Lukas, @deltaforce2 вы не отвечаете на мой вопрос, я не ищу советов такого рода, пожалуйста, дайте мне получить свой ответ и позвольте мне делать то, что я хочу. Спасибо (ничего личного, просто крайне сложно получить ответ об оптимизации при Stack Overflow, мне всегда приходится бороться с такого рода ответами)

5. Ну, смысл в указании начального размера списка не в стоимости инициализации. Это позволяет избежать множества копий из меньшего массива в больший массив каждый раз, когда внутренний массив должен быть расширен, чтобы вместить дополнительные элементы. Если вы заранее знаете конечный размер, не повредит указать его. Я также голосую за futureSize , это то, что говорит javadoc.

Ответ №3:

Почему бы не использовать класс apache commons FixedSizeList

Вот ссылка: Apache Commons FizedSizeList

Комментарии:

1. Спасибо, это хорошая идея, но мне нужно придерживаться исходных типов списков. 1, хотя

Ответ №4:

Путем цитирования javadoc:

ArrayList (int initialCapacity)

Создает пустой список с указанной начальной емкостью.

Следовательно, futureSize должно быть то, что вы используете. Все просто.

Ответ №5:

new ArrayList<String>(futureSize)

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

 new ArrayList<String>(futureSize probableDeviation)
  

Вставка еще только 1 элемента не решит проблему, поэтому было бы лучше использовать первый элемент без отклонений.