0. Прочитав эту статью, вы узнаете
- 11 советов по оптимизации производительности кода Java, которые стоит освоить
1. Введение
При разработке любого Java-приложения мы будем говорить оoptimization
- Понятие оптимизации. Как разработчик, мы должны сделать все возможное, чтобы код, который мы пишем, был чистым, без ошибок и максимально учитывал проблемы с производительностью.
С этой целью автор суммирует следующие 11 навыков оптимизации производительности кода Java, которые вы обязательно будете использовать.
2. 11 советов по оптимизации
2.1 Избегайте слишком длинных методов
Когда мы определяем метод, мы должны учитывать, что метод не должен быть слишком длинным, он должен быть предназначен для выполнения одной функции. Это на самом деле хорошо для обслуживания и производительности.
С одной стороны, с точки зрения сопровождения, методы соответствующей длины более читабельны и понятны, с другой стороны, методы загружаются в память во время загрузки класса и вызова метода. Если метод слишком велик, для его обработки потребуется дополнительная память и циклы ЦП. Мы должны научиться разбирать длинный метод на части в нужной логической точке.
2.2 Избегайте нескольких операторов if-else
Каждый должен быть знаком с этой точкой оптимизации. Но на самом деле при написании кода все равно if-else.
Это действительно повлияет на производительность. Потому что JVM должна сравнивать условия. Ситуация становится еще хуже, если вы используете одно и то же условие в циклах for, while и т. д.
Если в нашей бизнес-логике много условий, мы можем попытаться сгруппировать эти условия и вернуть логическое значение, которое затем можно использовать в операторе if.
Кроме того, если возможно, мы можем рассмотреть возможность использования оператора switch вместо нескольких операторов if-else. Оператор switch имеет преимущества в производительности по сравнению с оператором if-else. Давайте посмотрим на пример:
if (condition1) {
if (condition2) {
if (condition3 || condition4) { execute ..}
else { execute..}
По сравнению с приведенным выше кодом соответствующий подход должен быть следующим:
boolean result = (condition1 && condition2) && (condition3 || condition4)
2.3 Избегайте использования итераторов
Написание циклов в стиле foreach в Java5 действительно удобно и лаконично, и выглядит круто!
Но иногда быть крутым приходится за счет производительности.
Например:
for (String str: strs) {
. . .
}
Каждый раз, когда вы запускаете код, если strsIterable
, вы создадите новыйIterator
объект. Это приведет к большему потреблению памяти.
Если у тебя есть极致的追求
, то рекомендуется использовать оригинальное написание:
int size = strs.size();
for (int i = 0; i < size; i++) {
String value = strs.get(i);
. . .
}
2.4 Избегайте получения размера в коллекциях
При переборе любой коллекции получайте размер коллекции заранее, а не во время итерации — это позволяет избежать многократного вызова метода size().
См. этот пример ниже:
List<String> eleList = getData();
for (int i = 0; i < eleList.size(); i++) { execute code ..}
По сравнению с приведенным выше кодом соответствующий подход должен быть следующим:
List<String> objList = getData();
int size = objList.size();
for (int i = 0; i < size; i++) { execute code ..}
2.5 Избегайте использования+
объединенная строка
Начиная с JDK5, компилятор Java был оптимизирован с использованием+
Нет. сплайсинга строк, компилятор фактически автоматически оптимизирует использование StringBuilder после компиляции.
И String — это окончательный класс, объекты, созданные с помощью String, нельзя использовать повторно. Итак, если нам нужно объединить последовательно, используйте+
Объединение строк приведет к созданию нескольких объектов String, которые займут больше памяти в куче.
Вообще говоря, когда строк немного,+
Эффективность сплайсинга числа и StringBuilder почти одинакова, но если он включает单线程循环拼接
Когда нам лучше использовать StringBuilder для обеспечения оптимизации производительности.
См. пример ниже:
String str = "sample";
for (int i = 0; i < count; i++) {
str = str + "-" + i;
}
Более правильный подход заключается в следующем:
StringBuilder stringBuilder = new StringBuilder("sample");
for (int i = 0; i < count; i++) {
stringBuilder.append("-");
stringBuilder.append(i);
}
2.6 По возможности используйте примитивы
Потому что примитивные типы хранятся в памяти стека, а объекты — в памяти кучи. Если возможно, мы должны максимально использовать примитивные типы вместо объектов, поскольку доступ к стековой памяти осуществляется быстрее, чем к куче.
Поэтому в некоторых случаях для определения переменной или массива мы можем использовать int вместо Integer, double вместо Double.
2.7 Избегайте использования класса BigDecimal
Класс BigDecimal предоставляет точные десятичные значения, и чрезмерное использование этого объекта может сказаться на производительности, особенно когда этот объект используется для вычисления определенных значений в цикле.
BigDecimal занимает больше памяти, чем long или double при выполнении вычислений. Если точность не ограничена или если мы уверены, что диапазон вычисляемого значения не превысит long или double, мы можем не использовать BigDecimal и использовать long или double с соответствующими преобразованиями.
2.8 Избегайте слишком частого создания «дорогих» объектов
Есть некоторые классы, которые несут данные в приложении, и создание этих объектов требует больших затрат, и нам следует избегать их многократного создания.
Например, объекты подключения к базе данных, объекты конфигурации системы или объекты сеанса для входа пользователей. Эти объекты потребляют много ресурсов при создании, и мы должны выбрать повторное использование этих объектов вместо их повторного создания.
Для этих «дорогих» объектов мы используем шаблон singleton, когда это возможно, чтобы создать один экземпляр и повторно использовать его там, где это необходимо.
2.9. Используйте PreparedStatement вместо Statement
В настоящее время использование JDBC API для SQL-запросов должно быть относительно редким явлением, но я все же считаю, что это необходимо понимать.
Для параметризованных запросов PreparedStatement имеет преимущество перед Statement, поскольку объекты PreparedStatement компилируются один раз и выполняются несколько раз. Объекты операторов компилируются и выполняются каждый раз, когда они вызываются.
Кроме того, объекты PreparedStatement защищены от атак путем внедрения кода SQL.
2.10 Избегайте ненужных операторов журнала и неправильных уровней журнала
Этот совет должен быть общим, но большая часть кода игнорирует его. Когда мы создаем отладочную информацию, мы должны сначала проверить текущий уровень журнала.
В противном случае вы можете непреднамеренно создать бесполезное сообщение журнала. См. пример:
log.debug("User [" + userName + "] called method X with [" + i + "]");
log.debug(String.format("User [%s] called method X with [%d]", userName, i));
В этом случае нам нужно выполнить все необходимые шаги для создания информации журнала, не зная, будет ли программа использовать информацию журнала или нет.
Кроме того, что, если создание такой информации журнала требует большего потребления ресурсов?
Поэтому лучше сначала проверить текущий уровень журнала, см.:
if(log.isDebugEnabled()) {
log.debug("User [" + userName + " ] called method X with [" + i + "] ");
}
2.11 Выберите необходимые поля в SQL-запросе
Иногда нам нужно написать SQL для получения данных. На этом этапе мы должны избегать выбора всех столбцов базы данных и выбирать только те столбцы базы данных, которые нам нужны.
Выбор слишком большого количества столбцов может вызвать задержки в выполнении запросов к базе данных, а также увеличить сетевой трафик.
См. пример:
select * from books where book_id = 6;
Для этого предлагаю написать:
select book_title, book_desc, book_price from books where book_id = 6;
3. Заключение
Многие думают, что оптимизация производительности — сложная тема, требующая большого опыта и знаний, и в определенной степени это верно.
Для нас непростая задача разработать приложение и ожидать от него наилучшей производительности. Но даже если вы не являетесь экспертом по настройке производительности, есть несколько простых способов улучшить производительность.
Если вы все еще не уверены в этом, взгляните на другие мои статьи:
- Новые возможности Java# Новые возможности Java8-15, сколько вы знаете?
- # От звезды стартапов с открытым исходным кодом до создания бомб и, наконец, удаления библиотеки и побега, что он испытал?
- # [2021] Ни ветра, ни дождя - три года после смены карьеры и начала заново
Спасибо за просмотр этого выпускаЙи Джун@Monday Radio. Если вы думаете, что это неплохо, поддержите меня три раза подряд, увидимся в следующий раз.