Большинство разработчиков считают само собой разумеющимся, что оптимизация производительности является сложной и требует большого опыта и знаний. Ну, нельзя сказать, что это совершенно неправильно. Оптимизация вашего приложения для оптимальной производительности не является легкой задачей. Тем не менее, это не значит, что вы ничего не можете сделать, если у вас нет этих знаний. Вот 11 простых советов и лучших практик, которые помогут вам создать хорошо эффективное приложение.
Большинство предложений для Java. Но есть несколько предложений, которые не зависят от языка и могут применяться ко всем приложениям и языкам программирования. Прежде чем обсудить методы настройки производительности специально для Java, давайте посмотрим на общие советы.
1. Не оптимизируйте, пока не узнаете, что это необходимо
Это, вероятно, один из самых важных советов по настройке производительности. Вы должны следовать общим передовым методам и попытаться эффективно реализовать ваши варианты использования. Тем не менее, это не означает, что вы должны заменить любую стандартную библиотеку или создать сложные оптимизации, прежде чем оказаться необходимым.
В большинстве случаев преждевременная оптимизация не только займет много времени, но и затрудняет чтение и поддержание кода. Хуже того, эти оптимизации обычно не приносят никаких преимуществ, потому что то, что вы тратите много времени на оптимизацию, является некритической частью применения.
Итак, как вы докажите, что вам нужно что -то оптимизировать?
Во -первых, вам необходимо определить, насколько быстро ваш код приложения является, например, указать максимальное время отклика для всех вызовов API или указать количество записей, которые будут импортированы в определенном диапазоне времени. После того, как вы это сделаете, вы можете измерить, какие части применения слишком медленные для улучшения. Затем давайте посмотрим на второй трюк.
2. Используйте анализатор, чтобы найти настоящее узкое место
После того, как вы следили за первым предложением и определили, что некоторые части приложения нуждаются в улучшении, а затем с чего начать?
Вы можете решить проблему двумя способами:
Проверьте свой код и начните с той части, которая выглядит подозрительной или, по вашему мнению, может быть проблематичной.
Или используйте анализатор и получите подробную информацию о поведении и производительности каждой части кода.
Надеюсь, мне не нужно объяснять, почему я всегда должен следовать второму методу.
Очевидно, что подход на основе анализатора позволяет вам лучше понять влияние вашего кода и позволить вам сосредоточиться на самых важных частях. Если вы использовали анализатор, вы должны вспомнить, как удивлены, что вы узнали, какие части кода имели проблемы с производительностью. Честно говоря, мое первое предположение привело меня к неправильному направлению не раз.
3. Создайте набор тестирования производительности для всего приложения
Это еще один универсальный совет, который может помочь вам избежать многих неожиданных проблем, которые часто возникают после использования улучшения производительности в производстве. Вы всегда должны определять набор тестирования производительности, который проверяет все приложение и запустить его до и после улучшения производительности.
Эти дополнительные тестовые прогоны помогут вам определить функциональные и производительные побочные эффекты измененных и убедиться, что не причиняется вреда, чем принесены хорошие обновления. Это особенно важно, если вы работаете над компонентами, используемыми несколькими различными частями приложения, такими как базы данных или кэши.
4. Сначала дело с самым большим узким местом
После создания тестового набора и анализа приложения с использованием анализатора вы можете перечислить ряд проблем, которые необходимо решить для повышения производительности. Это здорово, но это все еще не отвечает на вопрос о том, с чего вы должны начать. Вы можете сосредоточиться на решениях быстрого действия или начать с наиболее важных вопросов.
Сначала быстрое действие могут быть привлекательными, потому что вы можете быстро показать первый результат. Но иногда вам может потребоваться убедить других членов команды или руководства в том, что анализ эффективности того стоит, потому что в настоящее время нет никакого эффекта.
Но в целом я рекомендую сначала решить самые важные проблемы с производительностью. Это обеспечит вам наибольшее улучшение производительности и, возможно, больше не нужно решать некоторые из этих проблем для удовлетворения требований к производительности.
Общие советы по настройке производительности заканчиваются здесь. Давайте внимательно рассмотрим некоторые советы для специфичных для Java.
5. Используйте StringBuilder для программного подключения строки
Есть много разных вариантов подключения строк на Java. Например, вы можете использовать Simple + или + =, а также StringBuffer или StringBuilder.
Итак, какой метод вы выбрать?
Ответ зависит от кода, соединяющего строку. Если вы добавляете новый контент в строку программно, например, в цикле, то вам следует использовать StringBuilder. Он прост в использовании и предлагает лучшую производительность, чем StringBuffer. Но помните, что по сравнению с StringBuffer, StringBuilder не является потоком и может не подходить для всех вариантов использования.
Вам просто нужно создать экземпляр нового StringBuilder и вызвать метод добавления, чтобы добавить новую часть в строку. После того, как вы добавили все детали, вы можете вызвать метод ToString (), чтобы получить подключенную строку.
На следующем фрагменте кода показан простой пример. Во время каждой итерации этот цикл преобразует I в строку и добавляет его в StringBuilder SB вместе с пространством. Таким образом, в конце, этот код напишет «Это тест 0 1 2 3 4 5 6 7 8 9» в файле журнала.
StringBuilder SB = new StringBuilder («Это тест»); for (int i = 0; i <10; i ++) {sb.append (i); sb.append ("");} log.info (sb.tostring ());Как вы можете видеть в фрагменте кода, вы можете предоставить первый элемент строки конструктору. Это создаст новый StringBuilder, который содержит предоставленную строку и 16 дополнительных символов. Когда вы добавляете больше символов в StringBuilder, JVM динамически увеличит размер StringBuilder.
Если вы уже знаете, сколько символов будет содержать ваша строка, вы можете предоставить это число различным конструкторам, чтобы создать создание строителя StringBuilder с определенной емкостью. Это дополнительно повышает эффективность, поскольку не требует динамического расширения своей способности.
6. Используйте + для объединения строки в операторе
Когда вы реализуете свое первое приложение в Java, кто -то, возможно, сказал вам, что вам не следует использовать + для подключения к строке. Если вы объединяете строки в логике приложения, это правильно. Строки неизменны, и результаты конкатенации каждой строки хранятся в новом строковом объекте. Это требует дополнительной памяти и замедлит ваше приложение, особенно если вы объединяете несколько строк в цикле.
В этих случаях вы должны следовать TIP 5 и использовать StringBuilder.
Но если вы просто разделите строку на несколько строк, чтобы улучшить читаемость вашего кода, это по -другому.
Query q = em.createequery ("select a.id, a.firstname, a.lastname"
+ «От автора А»
+ «Где a.id =: id»);
В этих случаях вы должны использовать простой + для объединения вашей строки. Компилятор Java оптимизирует это и выполняет соединения во время компиляции. Таким образом, во время выполнения ваш код будет использовать только 1 строку, и подключение не требуется.
7. Используйте примитивы как можно больше
Еще один простой и быстрый способ избежать каких -либо накладных расходов и улучшения производительности приложений - это использовать базовый тип вместо класса обертки. Следовательно, лучше всего использовать int вместо целого и двойного, а не двойного. Это позволяет JVM хранить значения в стеке, а не кучу, чтобы уменьшить потребление памяти и сделать более эффективную обработку.
8. Старайтесь избегать Biginteger и Bigdecimal
Поскольку мы обсуждаем типы данных, давайте быстро рассмотрим Biginteger и Bigdecimal. В частности, последний популярен благодаря своей точности. Но есть цена.
Biginteger и Bigdecimal требуют большей памяти, чем простая длинная или двойная, и значительно замедлят все расчеты. Таким образом, если вам нужна дополнительная точность, или цифры превысят дальний диапазон, лучше всего подумать дважды, прежде чем это сделать. Это, наверное, единственный способ, которым вам нужно изменить, чтобы решить проблемы с производительностью, особенно при внедрении математических алгоритмов.
9. Сначала проверьте текущий уровень журнала
Это предложение должно быть очевидным, но, к сожалению, многие программисты в основном игнорируют его при написании кода. Прежде чем создать сообщение отладки, вы всегда должны сначала проверять текущий уровень журнала. В противном случае вы можете создать строку сообщения журнала, которая будет проигнорирована позже.
Вот два отрицательных примера.
// не выполнять это log.debug ("user [" + username + "] называется методом x с [" + i + "]"); // или thislog.debug (string.format ("user [%s] называется методом x с [%d]", username, i));В обоих случаях вы выполните все необходимые шаги, чтобы создать сообщение журнала, не зная, будет ли структура журнала использовать сообщение журнала. Следовательно, лучше всего проверить текущий уровень журнала перед созданием сообщения отладки.
// Do Thisif (log.isdebugenabled ()) {log.debug ("user [" + username + "] называется метод x с [" + i + "]");}10. Используйте Apache Commons stringUtils.replace вместо string.replace
Вообще говоря, метод String.replace работает нормально и очень эффективен, особенно при использовании Java 9. Однако, если ваше приложение требует много операций замены и не обновляется до последней версии Java, то все еще необходимо найти более быстрые и эффективные альтернативы.
Существует альтернативный ответ на метод Apache Commons Lang StringUtils.replace. Как описал Лукас Эдер в недавнем сообщении в блоге, метод StringUtils.replace намного превосходит метод Java 8 String.Replace.
И это требует только незначительных изменений. То есть добавьте зависимости Maven от Apache Commons Lang Project в приложение Pom.xml и замените все вызовы на метод String.Replace с помощью метода StringUtils.replace.
// заменить thisTest.replace («test», «Simple Test»); // с помощью thisStringutils.replace (тест, «тест», «простой тест»);
11. Кэш дорогие ресурсы, такие как подключения к базе данных
Кэширование является популярным решением, чтобы избежать повторного выполнения дорогих или общих фрагментов кода. Общая идея проста: более дешевле использовать эти ресурсы, чем неоднократно создавать новые ресурсы.
Типичным примером является подключение к базе данных в пуле кэша. Новые соединения требуют времени для создания, чего можно избежать, если вы повторно используете существующие соединения.
Вы также можете найти другие примеры в самом языке Java. Например, значение значений значений Class Class Class между -128 и 127. Вы можете сказать, что создание нового целого числа не слишком дорого, но, поскольку его часто используются, кэширование наиболее часто используемых значений также может обеспечить преимущества производительности.
Однако, когда вы рассматриваете кэширование, помните, что реализации кэша также могут нести накладные расходы. Вам необходимо потратить дополнительную память на хранение многократных ресурсов, поэтому вам может потребоваться управлять кэшами, чтобы сделать ресурсы доступными, а также удалить устаревшие ресурсы.
Итак, прежде чем начать кэшировать любые ресурсы, убедитесь, что реализация кэша стоит того, то есть вы должны использовать их достаточно.
Суммировать
Как видите, иногда для повышения производительности вашего приложения не требуется много работы. Большинство предложений в этой статье требуют лишь небольших усилий, чтобы применить их к вашему коду.
Но самое главное - это хитрости, которые не связаны с тем, каким он язык программирования:
Не оптимизируйте использование анализаторов, чтобы найти реальные узкие места, прежде чем вы узнаете, что это необходимо. Сначала сделка с самыми большими узкими местами.
Выше приведено весь контент, разделенный в этой статье о очень простых и простых в понимании методов настройки производительности Java. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на этот сайт:
Java реализует подробный код для обмена функциями WeChat Public Platform WeChat Moments
Сравнительный анализ экземпляров эффективности сериализации нативной Java и сериализации Kryo
Исследование о том, может ли подкласс программирования Java переписать статический метод родительского класса
Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!