Ускорение Java - PullRequest
       26

Ускорение Java

14 голосов
/ 07 октября 2008

Это на самом деле два вопроса, но они очень похожи, и для простоты я решил, что я просто свожу их вместе:

  • Во-первых : Принимая во внимание устоявшийся Java-проект, какие есть приличные способы ускорить его, помимо простой оптимизации в коде?

  • Во-вторых : Каковы хорошие способы значительно повысить производительность при написании программы на Java?

Пожалуйста, держитесь подальше от общих методов оптимизации, если они не специфичны для Java .

Я спрашивал об Python и Perl ранее. Для Java мне интересно, какие хорошие советы / хитрости существуют для улучшения производительности и есть ли особенно хорошие профилировщики Java.

Ответы [ 15 ]

19 голосов
/ 07 октября 2008

Во-первых: при оптимизации кода я бы предположил, что вы сделали правильные алгоритмы и правильную реализацию алгоритмов. В этом случае вы должны использовать профилировщик и посмотреть, как часто ваш сборщик мусора (GC) собирает мусор и сколько времени он использует для этого. Затем вы начинаете работать над опциями GC, но будьте осторожны, вы можете столкнуться с проблемами, если не знаете, что делаете.
Я предполагаю, что вы используете Java 5/6. В этом случае я бы ознакомился с руководством по настройке java 5 по адресу http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html.. Существует также очень хорошая новостная рассылка по производительности java под названием http://www.javaperformancetuning.com/, на которую вы можете подписаться.

Кроме того, посмотрите, сколько блоков try / catch вы можете устранить. Посмотрите, сможете ли вы исключить ненужный выброс исключений.

Используйте кэши, где вы можете, НО не переусердствуйте.

Чтение эффективной Java, 1-е и / или 2-е издание

Профилировщики: я использую yourkit. Это очень хорошо для Java 1.5 и выше. Вы можете получить персональную лицензию. Другие профилировщики тоже хороши.

Так же, как у вас есть модульные и интеграционные тесты, не повредит иметь некоторые тесты производительности, которые вы выполняете как часть ваших сборок НЕПРЕРЫВНОЙ ИНТЕГРАЦИИ (CI). Таким образом, вы узнаете, когда вы регрессировали, особенно если вы используете хороший сервер сборки CI.

12 голосов
/ 07 октября 2008

Убедитесь, что ваш уровень лога не случайно оставлен на DEBUG:)

11 голосов
/ 07 октября 2008

«Мера, не угадай.»
Вот хорошая статья об использовании NetBeans Profiler для ускорения работы библиотеки iText PDF. Я сам использовал NetBeans Profiler и обнаружил, что он очень прост и полезен для выявления некоторых проблем с производительностью, которые у меня были.

Для более старых приложений простой переход на Java 6 может повысить производительность. См. этот технический документ для получения информации об улучшениях производительности в Java 6.

8 голосов
/ 07 октября 2008

Используйте новейшие виртуальные машины - они постоянно улучшаются.

Профиль и тест. Никогда не оптимизируйте свой код, если вы абсолютно не уверены, что вам нужно.

Если это приложение с графическим интерфейсом, переключение с Swing на AWT или, возможно, инструментарий Eclipse, это должно быть довольно быстро. Это более важно на старых виртуальных машинах (я уже некоторое время работаю со встроенными системами, и мы находимся в версии 1.0.x, свинг даже недоступен)

Я знаю, что это не относится только к Java, но не к распределению объектов - это включает в себя конкатенацию строк в цикле (вне цикла это довольно приемлемо. Это самое большое, что вы, вероятно, можете сделать.

Вы также можете держать объекты вокруг вместо того, чтобы освобождать / перераспределять их. Есть некоторые «ссылочные» классы, которые можно использовать для хранения объектов, которые вам не нужны, но, возможно, захотят использовать повторно - GC не удалит их, если ему не понадобится место.

Выделите больше места, если необходимо, с аргументом -MX.

Довольно сложно ускорить Java - HotSpot уже так много делает для вас, что все, что вы делаете, что, по вашему мнению, может ускорить ваш код, часто может замедлять его.

5 голосов
/ 08 октября 2008

Не оптимизировать вслепую. Используйте Yourkit или любой другой хороший профилировщик, чтобы найти «горячие точки» в вашем приложении.

Вам нужно не только посмотреть время процессора, но и то, сколько памяти выделено и освобожден за определенный шаг. Вы также хотите убедиться, что у вас нет утечек памяти или большого потребления памяти. Лучший инструмент для анализа потребления памяти, который я знаю, это Eclipse Memory Analyzer (http://www.eclipse.org/mat).

Другие размеры - это проблемы с резьбой и проблемы с вводом-выводом. Для простого способа проанализировать проблемы конкуренции, проверьте мой старый блог на https://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/wlg/4737

5 голосов
/ 07 октября 2008

Использование StringBuilder вместо больших наборов конкатенации строк дает значительное повышение относительной производительности.

Тем не менее, я не могу не сказать, что профилирование приносит пользу общей практике. Я не знаю, как использовать профилирование Java (используется только в академических целях), но профилирование помогает вам идентифицировать проблемные разделы вашего кода, и гораздо проще исправить определенные разделы, так как вам есть, что искать.

3 голосов
/ 07 октября 2008

Еще один потенциальный выигрыш в производительности можно реализовать, переключившись на более быструю виртуальную машину. Они не все сделаны равными, а некоторые лучше подходят для различных типов приложений. Каждый из них может также иметь определенные типы настроек, которые они поддерживают, а также стандартные настройки.

Некоторые сравнения

Кроме того, будьте осторожны с микробенчмарками для тестирования производительности, так как они не имеют смысла из-за того, как работает большинство ВМ. Поэтому некоторые очень простые тесты производительности могут вести себя по-разному по причинам, которые не очевидны.

Простой запуск теста, изменение небольшого фрагмента кода или опции виртуальной машины и повторный запуск могут привести к другим результатам, но не имеют никакого отношения к внесенным изменениям.

2 голосов
/ 05 ноября 2008

Вы также спрашивали об этом в отношении C #, и я бы дал тот же ответ, и было бы ошибкой начинать с привязки к конкретному языку. После того, как вы сожмете каждый цикл, который вы можете получить, используя общие методы и подходы, материал для конкретного языка может иметь значение.

2 голосов
/ 07 октября 2008

Так же, как и для любого языка, используйте соответствующие алгоритмы и структуры данных.

Одна хорошая вещь ООП - это то, что вы можете изменять реализации объекта без изменения интерфейса. Это позволяет начать кодирование с наивных реализаций и заменить их при необходимости.

2 голосов
/ 07 октября 2008

Для профилирования попробуйте JAMON для контроля времени и профилировщик NetBeans для общей производительности и мониторинга памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...