Эффективность замены текста - PullRequest
4 голосов
/ 12 февраля 2009

Расширение моего предыдущего вопроса:
Очистка и замена текста: удаление \ n из текста в Java

Я очищаю этот входящий текст, который поступает из базы данных с нерегулярным текстом. Это означает, что нет никаких стандартов или правил. Некоторые содержат HTML-символы, такие как & reg, & trade, & lt и другие, имеют следующую форму: & # 8221, & # 8211 и т. Д. В других случаях я просто получаю HTML-теги с <и>.

Я использую String.replace, чтобы заменить символы по их значению (это должно быть хорошо, так как я использую UTF-8, верно?), И replaceAll (), чтобы удалить теги HTML с помощью регулярного выражения.

Кроме одного вызова функции replace () для каждой замены и компиляции регулярного выражения тегов HTML , есть ли какие-либо рекомендации, чтобы сделать эту замену эффективной?

Ответы [ 3 ]

8 голосов
/ 12 февраля 2009

Мое первое предложение состоит в том, чтобы измерить производительность самого простого способа сделать это (который, вероятно, является множественными вызовами замены / замены всех). Да, это потенциально неэффективно. Довольно часто самый простой способ сделать это неэффективен. Вы должны спросить себя: сколько вы заботитесь?

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

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

3 голосов
/ 12 февраля 2009

Вы столкнетесь с узкими местами производительности с заменой на replaceAll.

Если вы хотите увеличить производительность

  1. не используйте замену - строки неизменны. Будут создавать копии каждый раз, когда вы звоните заменить
  2. не используйте регулярные выражения (replaceAll) - хотя при компиляции это не так плохо.
  3. Разбор и замена ваших собственных строк с помощью StringBuilder

Некоторый код на вашей стороне может помочь обсуждению.

String str = ...
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
  char toAppend = 'a';
  switch (str.charAt(i)) {
     case '&' : toAppend = '&'; break;
     case ...
      ...
      default: toAppend = str.charAt(i);
    }
   sb.append(toAppend);
  }

это от: Форумы Sun

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

Замена строк в Java очень медленная, я думаю, вам следует использовать более быстрый язык

здесь у вас есть пример кода, как заменить строку в сборке

http://szabgab.com/talks/fundamentals_of_perl/replace-string-in-assembly-code.html

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