Большинство разработчиков считают, что оптимизация производительности является относительно сложной проблемой и требует большого опыта и знаний. Да, в этом нет ничего плохого. По общему признанию, оптимизация вашего приложения для достижения наилучшей производительности - непростая задача, но это не значит, что вы ничего не можете сделать, не получая этот опыт и знания. Вот несколько простых в последующих советах и лучших практиках, которые могут помочь вам создать хорошо эффективное приложение.
Большинство из этих предложений основаны на Java, но не обязательно, а некоторые могут применяться ко всем приложениям и языкам программирования. Прежде чем мы поделимся советами по настройке производительности на основе Java, давайте обсудим эти общие советы по настройке производительности.
1. Не оптимизируйте, прежде чем необходимо
Это, вероятно, один из самых важных советов по настройке производительности. Вы должны следовать общим передовым методам и попытаться эффективно реализовать ваши варианты использования. Но это не означает замену любой стандартной библиотеки или строительных комплексных оптимизаций, прежде чем доказывать, что это необходимо.
В большинстве случаев преждевременная оптимизация занимает много времени, что затрудняет чтение и поддержание кода. Хуже того, эти оптимизации обычно не приносят никаких преимуществ, потому что вы тратите много времени на оптимизацию некритических частей вашего приложения.
Итак, как вы докажите, что вам нужно что -то оптимизировать?
Во -первых, вам необходимо определить скорость кода вашего приложения, например, указать максимальное время отклика для всех вызовов API или указать количество записей, которые будут импортированы в течение определенного диапазона времени. После этого вы можете измерить, какие части применения слишком медленные для улучшения. После этого продолжайте смотреть на второй наконечник настройки.
2. Используйте анализатор, чтобы найти настоящее узкое место
После того, как вы следовали первым советам и определите, что некоторые части вашего приложения нуждаются в улучшении, спросите себя, с чего начать?
Вы можете решить эту проблему двумя способами:
Что касается того, почему всегда следует соблюдать второй метод.
Ответ должен быть очевиден, и подход на основе анализатора позволит вам лучше понять производительность вашего кода и позволить вам сосредоточиться на самых важных частях. Если вы когда -либо использовали анализатор, вы будете удивлены, при которых части кода вызывают проблемы с производительностью. Однако много раз, ваше первое предположение приведет вас в неправильном направлении.
3. Создайте набор тестирования производительности для всего приложения
Это еще один общий трюк, который поможет вам избежать многих неожиданных проблем, которые часто возникают после того, как улучшение производительности внедряется в производственную среду. Вы должны часто определять набор тестирования производительности, который проверяет все приложение и запустить его до и после завершения улучшения производительности.
Эти дополнительные тестовые прогоны помогут вам определить функциональное влияние и эффективность изменения изменения и убедиться, что вы не выпустите обновление, которое приносит больше вреда, чем пользы. Это особенно важно, если ваши задачи работают на нескольких разных частях приложения, таких как база данных или кэш.
4. Сначала решите самую большую проблему с узким местом
После создания тестового набора и использования анализатора для анализа приложения у вас есть список вопросов, которые необходимо повысить производительность, что здорово, но он все еще не отвечает на вопрос, с чего вы должны начать. Вы можете начать с тех, которые можно сделать быстро или начать с самых важных вопросов.
Конечно, первое очень заманчиво, потому что скоро это даст результаты. Иногда может быть необходимо убедить других членов команды или вашего руководства в том, что анализ эффективности того стоит.
Но в целом я предлагаю сначала начать с самых важных проблем с производительностью. Это даст вам наибольшее улучшение производительности, и вам может потребоваться только несколько из этих проблем, чтобы решить ваши потребности в производительности.
После понимания общих методов настройки производительности, давайте внимательно рассмотрим некоторые методы настройки, специфичные для Java.
5. Используйте StringBuilder для программного подключения строк
В Java есть много разных вариантов соединения строк. Например, вы можете использовать простой + или + = =, старый StringBuffer или StringBuilder.
Итак, какой метод вы выбрать?
Ответ зависит от кода, который соединяет строку. Если вы программно добавляете новый контент в строку, например, в цикле для цикла, вы должны использовать StringBuilder. Это проще в использовании и обеспечивает лучшую производительность, чем StringBuffer. Но помните, что StringBuilder отличается от StringBuffer, он не безопасен для потока и может не подходить для всех вариантов использования.
Вам просто нужно создать экземпляр нового StringBuilder и вызвать метод добавления, чтобы добавить новую часть в строку. После того, как вы добавили все детали, вы можете вызвать метод ToString (), чтобы получить строку подключения.
На следующем фрагменте кода показан простой пример. Во время каждой итерации этот цикл преобразует I в строку и добавляет его в пространство StringBuilder SB, поэтому в конце этот код записывается в «test0123456789» в файл журнала.
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, кто -то может сказать вам, что вам не следует использовать + для octenate Strings. Это правильно, если вы подключите строку в логике приложения. Строки неизменны, и результат каждой строковой конкатенации хранится в новом строковом объекте. Это требует дополнительной памяти и замедляет приложение, особенно при объединении нескольких строк в цикле.
В этих случаях вы должны следовать TIP 5 и использовать StringBuilder.
Но если вы просто разбиваете строку на несколько строк, чтобы улучшить читаемость вашего кода, это не так.
Query q = em.createequery ("select a.id, a.firstname, a.lastname"+ "из автора a"+ ", где 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));В обоих случаях вы выполните все шаги, необходимые для создания сообщения журнала, не зная, использует ли фреймворк журнала сообщение журнала. Перед созданием отладочного сообщения лучше сначала проверить текущий уровень журнала.
10. Используйте Apache Commons stringUtils.replace вместо string.replace
Вообще говоря, метод string.replace работает хорошо и очень эффективен, особенно если вы используете Java 9. Однако, если приложение требует много операций по замене и вы не обновили последнюю версию Java, все равно имеет смысл проверить на более быстрые и более эффективные альтернативы.
Одним из кандидатов является метод Apache Commons Lang StringUtils.replace. Как описал Лукас Эдер в недавнем сообщении в блоге, он значительно перевешивает метод string.replace Java 8.
Это требует только небольшого изменения. Вам просто нужно добавить зависимость Maven в ваше приложение pom.xml для проекта Apache's Commons Lang и заменить все вызовы на методы String.Replace с помощью методов StringUtils.replace.
// заменить thisTest.replace («test», «Simple Test»); // с помощью thisStringutils.replace (тест, «тест», «простой тест»);
11. Кэш дорогие ресурсы, такие как подключения к базе данных
Кэширование является популярным решением, чтобы избежать повторного выполнения дорогих или часто используемых фрагментов кода. Общая идея проста: гораздо дешевле использовать эти ресурсы, чем создавать новый ресурс снова и снова.
Типичным примером являются подключения к кешам в пуле. Создание нового подключения требует времени и может быть избежано, если существующее соединение повторно используется.
Другие примеры также можно найти на самом языке Java. Например, значение значений значений Class Class Class между -128 и 127. Вы можете сказать, что создание нового целого числа не слишком дорого, но его часто используются, и кэширование наиболее часто используемых значений обеспечивает преимущества производительности.
Но когда вы думаете о кэшировании, помните, что реализации кэша также могут нести накладные расходы. Вам необходимо потратить дополнительную память на хранение многократных ресурсов, поэтому вам может потребоваться управлять вашим, чтобы обеспечить доступ к ресурсам или удаление устаревших ресурсов.
Итак, прежде чем начать кэшировать любые ресурсы, обязательно используйте их часто.
Суммировать
Как вы можете видеть, улучшение производительности вашего приложения иногда не требует большой работы. Большинство предложений в этой статье на самом деле требуют небольших усилий, чтобы применить их к коду.
Но наиболее важным советом является то, что он очень независим от языка программирования:
Оригинальная ссылка: 11 простых советов по настройке исполнения Java (редактор/Wei Wei)