Java String.replace () vs. String.replaceFirst () vs. homebrew

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

Пример:

string modified;
for(int i = 0; i < num_strings; i++){
 modified = runReplacements(strs[i]);
 //do stuff
}

public runReplacements(String str){
  str = str.replace("foo","bar");
  str = str.replace("baz","beef");
  ....
  return str;
}

'foo', 'baz' и все другие "цели" должны появиться только once и являются строковыми литералами (фактическое регулярное выражение не требуется).

Как вы понимаете, меня беспокоит производительность :)

Учитывая это,

  • replaceFirst () кажется плохим выбором, потому что он не будет использовать Pattern.LITERAL и будет выполнять дополнительную обработку, которая не требуется.

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

Кроме того, поскольку мои тексты замены всегда одинаковы, мне кажется имеет смысл написать свой собственный код, иначе String.replaceFirst () или String.replace () будут выполнять Pattern.compile каждые один раз в фоновом режиме. Думая, что я должен написать свой собственный код, я подумал:

  • Выполнять Pattern.compile () только один раз для каждой желаемой буквальной замены (нет необходимости перекомпилировать каждый раз) ( т.е. p1 - p30)

  • Затем сделайте следующее для каждого pX: p1.matcher (str) .replaceFirst (Matcher.quoteReplacement ("desireReplacement"));

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

Итак, что лучше для производительности?

5
задан nhahtdh 12 January 2014 в 19:47
поделиться