Общие методы оптимизации программы по скорости - PullRequest
3 голосов
/ 17 ноября 2010

Каковы некоторые общие методы оптимизации программы на Java с точки зрения скорости.Я использую DOM Parser для синтаксического анализа XML-файла и последующего сохранения определенных слов в ArrayList, удаления любых дубликатов и проверки правописания этих слов путем создания URL-адресов поиска Google для каждого слова, получения HTML-документа, поиска исправленного слова и сохранения егоДругой ArrayList.

Любая помощь будет оценена!Спасибо.

Ответы [ 4 ]

3 голосов
/ 17 ноября 2010

Зачем вам нужно улучшить производительность?Из вашего объяснения довольно очевидно, что большим узким местом (или ударом по производительности) будет IO в результате того, что вы получаете доступ к URL .

Это, безусловно, превзойдет на порядки любые незначительные улучшения, которые вы сделаете в структурах данных или структурах XML.

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

Вот мои общие методы:

  • Ваша программа выполняет какие-нибудь явно дорогие задача с точки зрения латентность (IO)?Достаточно ли у вас регистрации, чтобы увидеть, что именно здесь задержка (если она значительна)?

  • Ваша программа склонна к конфликту блокировок (то есть может ли она ждать, ничего не делая, ждатьдля какого ресурса быть "бесплатным")? Возможно, вы блокируете целое Map, в то время как вы производите дорогостоящий расчет значения для хранения, блокируя доступ других потоков к карте

  • Есть ли некоторые очевидныеалгоритм (возможно, для сопоставления данных или сортировки), который может иметь плохие характеристики?

  • Запустите профилировщик (например, jvisualvm, который поставляется вместе с JDK) и посмотрите на вашкод горячих точек.Где JVM проводит свое время?

3 голосов
/ 17 ноября 2010

SAX быстрее, чем DOM. Если вы не хотите проходить ArrayList в поисках дубликатов, поместите все в LinkedHashMap - без дубликатов, и вы все равно получите порядок вставки, который дает вам ArrayList.

Но реальным узким местом будет отправка HTTP-запроса в Google, ожидание ответа и его анализ. Вместо этого используйте библиотеку проверки орфографии.

Редактировать: Но возьмите мои образованные догадки с недоверием. Используйте профилировщик кода, чтобы увидеть, что действительно замедляет вашу программу.

1 голос
/ 17 ноября 2010

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

Как только вы выяснили, что занимает много времени,сосредоточиться на улучшении ваших алгоритмов.Например, удаление дубликатов из ArrayList может быть сложностью O (n²), если вы используете наиболее очевидный алгоритм, но его можно уменьшить до O (n), если вы используете правильные структуры данных.

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

Редактировать

Как это ни странно выражает @oxbow_lakes, не все узкие места в производительности можно найти в характеристиках кода big-O.Я, конечно, не собирался подразумевать, что они были.Поскольку вопрос был о «общих методах» оптимизации, я старался придерживаться общих идей, а не говорить об этой конкретной программе.Но вот как вы можете применить мой совет к этой конкретной программе:

  1. Посмотрите, где у вас узкое место.Есть несколько способов профилировать ваш код, начиная от дорогостоящего программного обеспечения для профилирования и заканчивая хакингом.Скорее всего, любой из этих методов покажет, что ваша программа тратит 99% своего времени на ожидание ответа от Google.
  2. Сосредоточьтесь на алгоритмах.Прямо сейчас ваш алгоритм (примерно):
    1. Разбор XML
    2. Создание списка слов
    3. Для каждого слова
      1. Пинг Google для проверки орфографии.
    4. Возвращаемые результаты

Поскольку большая часть вашего времени проводится в фазе "ping Google", очевидный способ исправитьэто позволит избежать выполнения этого шага больше, чем необходимо.Например:

  1. Анализ XML
  2. Создание списка слов
  3. Отправка списка слов в службу правописания.
  4. Анализ результатов проверки правописанияservice.
  5. Вернуть результаты

Конечно, в этом случае наибольшее увеличение скорости, вероятно, будет происходить при использовании средства проверки орфографии, которое работает на той же машине, но это не всегдаопция.Например, TinyMCE запускается как программа javascript в браузере, и она не может позволить себе загрузить весь словарь как часть веб-страницы.Поэтому он упаковывает все слова в отдельный список и выполняет один AJAX-запрос, чтобы получить список тех слов, которых нет в словаре.

0 голосов
/ 17 ноября 2010

Эти люди, вероятно, правы, но несколько случайных пауз превратят *, вероятно, "в" определенно, и вот почему ".

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