Подтвердить что ты не робот

Ускорение Java

На самом деле это два вопроса, но они настолько похожи, и чтобы все было просто, я подумал, что просто сверну их:

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

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

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

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

4b9b3361

Ответ 1

Во-первых: при оптимизации кода я бы предположил, что вы сделали правильные алгоритмы и правильную реализацию алгоритмов. В этом случае вы должны использовать профилировщик и посмотреть, как часто ваш сборщик мусора (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.

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

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

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

Ответ 5

Использование StringBuilder вместо больших наборов конкатенации String дает большую относительную производительность.

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

Ответ 6

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

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

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

Ответ 7

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

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

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

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

Ответ 11

Я видел, что иногда просто предоставление JVM больше памяти кучи поможет вялому приложению. Это выполняется с помощью параметров -xmx и -xms JVM при запуске.

Ответ 12

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

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

Ответ 13

Java 1.6_07 + поставляется со своим профилировщиком. Он называется Java VisualVM. Просто введите jvisualvm в командной строке, если у вас есть% JAVA_HOME%/bin на вашем PATH.

Ответ 14

Вот старый документ Peter Sestoft, который стоит прочитать: Производительность в java. Некоторые из советов, вероятно, не верны, так как Java значительно улучшилась с более поздними версиями в оптимизации. Но есть все еще хороший набор драгоценных камней, чтобы использовать и пытаться, когда профайлер нашел что-то, что вы не можете сделать другим способом (т.е. Сменить алгоритмически).

Ответ 15

Это может показаться нерелевантным, но на сайте разработчика Android есть список советов по скорости. Он работает на телефоне по нестандартному байт-коду dalvik, но многие из перечисленных там советов повсеместно применимы к Java в целом.