Устаревшие советы по оптимизации Java

Существует несколько советов по производительности, устаревших компилятором Java, и особенно Оптимизация профиля.. Например, эти оптимизированные платформой платформы могут радикально (согласно источникам) снизить стоимость вызовов виртуальных функций. VM также способна встраивать методы, разворачивать петли и т.д.

Каковы другие методы оптимизации производительности, которые вы применяли, которые все еще применяются, но фактически устарели с помощью механизмов оптимизации, обнаруженных в более современных JVM?

Ответ 1

Последний модификатор методов и параметров метода вообще не помогает в производительности.

Кроме того, Java HotSpot wiki дает хороший обзор оптимизаций, используемых HotSpot, и как эффективно использовать их в Java-коде.

Ответ 2

Люди заменяют String a = "this" + var1 + " is " + var2; несколькими вызовами StringBuilder или StringBuffer. На самом деле он уже использует StringBuilder за кулисами.

Ответ 3

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

  • Правило # 1 Никогда не выполняйте оптимизацию производительности на ранней стадии разработки. Никогда не делайте этого, если это вам не нужно. Если это решится, то:
  • используйте профайлер, чтобы найти узкие места, просмотрите исходный код, чтобы найти причины узких мест;
  • выберите подходящую структуру данных с наилучшим подходом к определенным компиляциям времени/памяти;
  • выберите соответствующие алгоритмы (например, итерация против рекурсии и т.д.);
  • избегать использования синхронизированных объектов из java-библиотеки, если вам это не нужно;
  • избегать явного/неявно нового создания объекта;
  • переопределять/повторно внедрять типы данных/алгоритмы, идущие с java, если и только если вы уверены, что они не соответствуют вашим требованиям.
  • Используйте небольшие независимые тесты для проверки производительности выбранных структур альгос/данных.

Ответ 4

В 2001 году я сделал приложения для телефона J2ME. Это был размер кирпича. И очень почти вычислительная мощность кирпича.

Запуск приложений Java на приемлемой основе потребовал их написания как можно более процедурным способом. Кроме того, очень большое улучшение производительности состояло в том, чтобы поймать ArrayIndexOutOfBoundsException, чтобы выйти из-петли по всем элементам в векторе. Подумайте об этом!

Даже на Android есть "быстрые" циклы через все элементы массива и "медленные" способы написания одного и того же, как упоминалось в видеороликах Google IO на внутренних серверах dalvik.

Однако, отвечая на ваш вопрос, я бы сказал, что в наши дни очень необычно, чтобы в этом было оптимизировать микро-оптимизацию, и я ожидал, что на JIT VM (даже на новой версии Android 2.2 VM, который добавляет JIT), эти оптимизации являются спорными. В 2001 году на телефоне был запущен переводчик KVM на частоте 33 МГц. Теперь он запускает dalvik - намного более быструю VM, чем KVM - с частотой 500 МГц до 1500 МГц, с гораздо более быстрой архитектурой ARM (лучший процессор, позволяющий получать тактовые частоты) с L1 e.t.c. и JIT.

Мы еще не находимся в сферах, где мне было бы удобно делать прямые манипуляции с пикселями в Java - либо на телефоне, либо на рабочем столе с i7 - поэтому есть нормальный ежедневный код, который Java не быстро достаточно для. Вот интересный блог, который утверждает, что эксперт сказал, что Java - это 80% скорости С++ для какой-то тяжелой задачи CPU; Я скептически отношусь, я пишу код манипуляции с изображением, и я вижу порядок между Java и native для циклов по пикселям. Может, мне не хватает трюка...?: D

Ответ 5

  • Не вручную вызывать сборщик мусора, это вредит производительности в современных реализациях JVM.
  • Целое число вместо Long не будет экономить много места, но ограничит диапазон чисел.
  • Избегайте ручных классов Enum и вместо этого используйте встроенный Enum. Java 1.5 представила реальные Enums, используйте их.

Ответ 6

При использовании x64 JVM с оперативной памятью менее 32 ГБ:

64-битная JVM использует на 30% -50% больше памяти в сравнении с 32-разрядной JVM из-за более крупных обычных указателей объектов. Вы можете значительно уменьшить этот коэффициент, используя JDK6 +.

От JDK6u6p до JDK6u22 он является необязательным и может быть включен путем добавления аргумента JVM:

-XX:+UseCompressedOops 

Из JDK6u23 (JDK7 также) он включен по умолчанию. Подробнее здесь.

Ответ 7

  • "Преждевременная оптимизация - корень всего зла" (Дональд Кнут)
  • Полезно оптимизировать только узкие места.
  • Вы должны анализировать код в каждой ситуации. Возможно, вы можете заменить TreeSet быстрым HashSet, потому что вам не нужна функция сортировки, или вы можете использовать float вместо double (смотрите SDK для Android).
  • Если никакая методика не позволяет вам попробовать переписать кусок кода и вызвать его через JNI, чтобы работающий код работал.