#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 timeensureCapacity
. Таким образом, вы не столкнетесь с проблемами == размер списка не будет изменен
Ответ №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 элемента не решит проблему, поэтому было бы лучше использовать первый элемент без отклонений.