Ищете предложения о том, как улучшить производительность фрагментов кода Java - PullRequest
1 голос
/ 06 марта 2012

В моем проекте мне нужно скачать html (около 50K-100K длиной при чтении в String, да, довольно толстый) и извлечь некоторое содержимое с помощью регулярных выражений. И затем вставить их в базу данных.Производительность довольно плохая, и я хочу знать, почему.

Процесс кодов такой (многопоточный):

  1. с использованием httpcomponents для загрузки html-файла в String (Строка html)
  2. с использованием регулярных выражений для извлечения содержимого и вставки (база данных mysql)
Pattern p = Pattern.compile("<h.*</a></h.>",Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(html);
boolean result = m.find();
while (result) {
    //insert into database stuff
    //update database stuff
}

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

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

Ответы [ 4 ]

2 голосов
/ 06 марта 2012

Стоп тут.

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

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

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

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

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

1) Если у вас нет переключателей ГХ, включите их сейчас. Производственные приложения Java не должны никогда работать без регистрации GC.

2) Перезапустите тестовый пример, запустив vmstat 1 (если это Unix) или диспетчер задач (если это Windows).

3) Обновите свой вопрос, указав сведения о том, увеличивается ли загрузка ЦП до 100% во время выполнения теста, и мы можем сделать следующий шаг.

2 голосов
/ 06 марта 2012
  1. Старайтесь избегать регулярных выражений, используйте стандартный анализатор HTML, например JSoup , их много. Они могут быть более эффективными, по крайней мере, больше, чем Regex, я надеюсь.

  2. Если вы используете регулярное выражение, старайтесь не компилировать регулярное выражение каждый раз. Может иметь частную статическую для Pattern. Но это не огромный выигрыш в производительности, просто хорошая практика.

  3. Использовать пул соединений для базы данных. По возможности делайте пакетные вставки.

1 голос
/ 06 марта 2012

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

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

Используйте взамен HTML Parser . См. Также Каковы плюсы и минусы ведущих HTML-парсеров Java?

1 голос
/ 06 марта 2012

Используйте профилировщик, например VisualVM .Он точно покажет вам, какой метод занимает время.

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

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

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