Comments 16
1. Забудьте про конкатенацию строк — используйте StringBuilder
Если речь не идёт про цикл, то оптимизатор сам из конкатенации сделает StringBuilder.
А вот у
LinkedList
или сложных абстракций — это может быть дорогой операцией.
У LinkedList это переменная, которая просто возращается
Типичные виновники:
static HashMap
, который никогда не очищает записи;
Это в каком финтех-стартапе такое типично используется?
Пункты 2 и 7. Почти никто не использует LinkedList...
Это DeepSeek или ChatGPT?
Вместо ручного управления блокировками используйте ConcurrentHashMap — он уже оптимизирован для многопоточности.
Очень вредный совет. Шаг вправо, шаг влево - попытка к бегству со всеми вытекающими. Что если, например, 2 параметра одновременно изменить надо? Осваивайте блокировки и Java Memory Model. Это база. Без понимания этих инструментов работа с многопоточностью гарантированно обернётся катастрофой.
индексы: если
WHERE
медленный, значит, не хватает индекса
И сразу следом:
Профилируйте без пощады - догадки для дилетантов
Несостыковочка
Какие-то советы для начинающих индусов из года примерно 2010. Блог компании OTUS, наш девиз "похер на качество контента, мы берём количеством".
Проблема со склеиванием строк не в том, что память потребляется, память-то выделить очень быстро. Проблема в том, что из старого объекта копируются символы в новый объект, много раз. StringBuilder делает то же самое внутри, когда не хватает буфера. Правильная оптимизация - это прикинуть окончательный размер строки, и передать его в StringBuilder.
Не нужно size() выносить в переменную, компилятор это оптимизирует сам.
Вроде история со сложением строк уже давно не актуальна, компилятор достаточно умён чтобы заменить ее на билдер "под капотом".
Когда увидел название статьи, то обрадовался: освежу в памяти нужную тему. Разочарование подкралось незаметно..
Присоединяюсь к комментаторам выше и допишу свою мысль:
-- Используйте флаг -XX:+UseG1GC
Давно уже по умолчанию используется G1 (еще с 10 версии). Не так много проектов осталось на 8ке. Но если остались, то там именно этой оптимизации не хватает! Как и некоторые другие примеры, этот более теоретический. Сколько у людей спрашивал, большинство вообще не знает настройки хипа и других параметров jvm на проде, не то что установка какого-то кастомного GC.
Если код будет признан горячим, jit компилятор должен и так убрать повторные вызовы .size().
Сложение строк тоже давным давно превращается в билдер на уровне javac.
К библиотекам от апач тоже много вопросов из-за их любимых транзитивных зависимостей - джарник потом весит сотни метров.
И полностью отказаться от блокировок в пользу concurrent hash map в общем случае довольно сложно.
Надеюсь этот пост это стеб, а не реальный пост?
1. Забудьте про конкатенацию строк — используйте StringBuilder - Java уже давным давно умеет разрешать автоматически конкатенацию строк
str += i; будет работать также быстро, как и StringBuilder
2. Циклы: тихий убийца производительности
Просто откройте реализацию метода size у LinkedList, там просто возвращается сохраненное значение size
По остальным пунктам тоже, чистая вода, никакой реальной идеи
LinkedList.size() вернётся за O(1).
И вообще, перестаньте его уже использовать. Он даёт профит только при добавлении/удалении из начала списка и даже не до середины. O(n) время итерации до удаляемого элемента даёт о себе знать, это только сама операция замены указателей константная.
В целом статья информативная. Мне, как +- опытному джависту хватило оглавления - все "техники" понятны и известны, их просто обобщили. Для новичков понадобится читать статью почти полностью)
В мире, где миллисекунды стоят миллионы - java обычно не используется.
Я понимаю, ваша цель - ненавязчивая реклама. Но может не стоит все подряд переводить? Это реальная дешевка. Насколько разумно, что с вашим брендом ассоциируется такое вот?
10 техник оптимизации Java, которые выведут вас на новый уровень