Какой стандартный рефакторинг оптимизации я могу сделать с моим Java-приложением? - PullRequest
4 голосов
/ 27 февраля 2009

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

Например, я недавно нашел

String.matches(regex)
Функция

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

Есть ли еще что-то простое, на что я должен посмотреть?

Ответы [ 6 ]

5 голосов
/ 27 февраля 2009

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

Если у вас хорошо написанное приложение, тогда самое время запустить профилировщик и оптимизировать только то, что имеет значение.

5 голосов
/ 27 февраля 2009

Посмотрите на эти разные инструменты:

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

Все эти инструменты бесплатны!

Во всем мире они не помогут вам улучшить производительность, но качество кода.

4 голосов
/ 27 февраля 2009

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

Я бы беспокоился о безопасности потоков. Сколько внимания было уделено этому?

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

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

1 голос
/ 27 февраля 2009

Одна очень важная вещь, которую нужно сделать при рефакторинге для улучшения приложения, - это сначала рефакторинг кода, чтобы исходный код выглядел хотя бы прилично. После этого никогда не угадайте, где оптимизировать, всегда измеряйте узкие места и концентрируйтесь на решении этих проблем. Обычно программистам нравится делать такие вещи, как обмен рекурсивных методов на циклы, выбор точного правильного алгоритма сортировки и т. Д., Что очень часто вообще мало что меняет. Поэтому убедитесь, что вы сфокусированы на правильной области (слишком много ресурсов процессора? Память? Слишком много потоков? Блокировка длинных потоков?)

РЕДАКТИРОВАТЬ: Как написал один из других авторов, конечно, убедитесь, что другие члены вашей команды / вашего босса считают, что эта работа стоит того же, если для них это не проблема, возможно, им будет все равно.

0 голосов
/ 27 февраля 2009

Если вы увлекаетесь книгами, я очень рекомендую прочитать Effective Java Джоша Блоха.

0 голосов
/ 27 февраля 2009

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

Еще одна полезная вещь (если вы немного смелы) - это использовать NetBeans 7.0 M2 (не паникуйте, их не-релизная версия, как правило, очень стабильна), есть плагин под названием «Джекпот», который ищет ваш код для рефакторингов. Некоторые из них связаны с производительностью ... но я не думаю, что кто-то из них радикально изменит скорость.

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

То, что я делал однажды, когда писал что-то, что, как я знал, должно было быть быстрым (это был код для разбора файлов классов), - запускал профилировщик каждый раз, когда я вносил изменения. Поэтому на один шаг я решил уменьшить memroy, вызвав String., Intern, чтобы убедиться, что все строки были объединены. Когда я добавил вызов intern (), память немного затормозилась, но время увеличилось на огромную величину (String.intern излишне медленен, или это было несколько лет назад). Поэтому в тот момент я знал, что то, что я только что сделал, было невероятно медленным, и я отменил это изменение.

Я не рекомендую делать это в общей разработке, но запускать код через профилировщик один раз в день или раз в неделю, просто чтобы посмотреть, как дела, не является убийцей производительности.

...