Советы по производительности Java - PullRequest
19 голосов
/ 02 июня 2009

У меня есть программа, которую я перенес с C на Java. Оба приложения используют быструю сортировку, чтобы упорядочить некоторые разделенные данные (геномные координаты).

Java-версия работает быстро, но я бы хотел приблизить ее к C-версии. Я использую Sun JDK v6u14.

Очевидно, что я не могу получить паритет с приложением C, но я хотел бы узнать, что я могу сделать, чтобы добиться максимально возможной производительности (в пределах среды).

Что можно сделать для проверки производительности различных частей приложения, использования памяти и т. Д.? Что бы я сделал, в частности?

Кроме того, какие приемы я могу реализовать (в целом), чтобы изменить свойства и организацию моих классов и переменных, сократить использование памяти и повысить скорость?

EDIT : Я использую Eclipse и, очевидно, предпочел бы бесплатные опции для любых сторонних инструментов. Спасибо!

Ответы [ 14 ]

0 голосов
/ 02 июня 2009

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

0 голосов
/ 02 июня 2009

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

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

0 голосов
/ 02 июня 2009

Ваш код сортировки выполняется только один раз, например в утилите командной строки, которая просто сортирует или многократно, например, веб-приложение, которое сортирует в ответ на какой-либо пользовательский ввод?

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

Это большое преимущество по сравнению с C / C ++.

Виртуальная машина во время выполнения оптимизирует код, который часто используется, и делает это довольно хорошо. Из-за этого производительность может превзойти C / C ++. В самом деле. ;)

Ваш пользовательский Comparator может быть местом для оптимизации.

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

Используйте либо Collections.sort (список, компаратор), либо Arrays.sort (массив, компаратор). Вариант массива будет немного быстрее, см. Соответствующую документацию.

Как уже говорил Андреас: не пытайтесь перехитрить ВМ.

0 голосов
/ 02 июня 2009

Методологически, вы должны профилировать приложение, а затем получить представление о том, какие компоненты вашей программы требуют много времени и памяти, а затем поближе познакомиться с этими компонентами, чтобы улучшить их производительность (см. Amdahl's закон ).

Из чисто технологического POV вы можете использовать некоторые компиляторы java-to-native кода, такие как джет Excelsior, но я должен отметить, что недавние JVM действительно быстрые, поэтому виртуальная машина не должна оказывать существенного влияния.

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