У меня есть старый фрагмент кода, который выполняет поиск и замену токенов в строке.
Он получает карту из пар from
и to
, выполняет итерации по ним и для каждой из этих пар, перебирает целевую строку, ищет from
, используя indexOf()
, и заменяет его значением to
.Он выполняет всю работу над StringBuffer
и в конечном итоге возвращает String
.
Я заменил этот код на следующую строку: replaceAll("[,. ]*", "");
И я провел несколько сравнительных тестов производительности.
Когдасравнивая для 1,000,000
итераций, я получил это:
Старый код: 1287 мс
Новый код: 4605 мс
в 3 раза дольше!
Затем я попытался заменить его 3 вызовами на replace
:
replace(",", "");
replace(".", "");
replace(" ", "");
Это привело к следующим результатам:
Старый код: 1295
Новый код: 3524
В 2 раза дольше!
Есть идеи, почему replace
и replaceAll
так неэффективны?Могу ли я сделать что-нибудь, чтобы сделать это быстрее?
Редактировать: Спасибо за все ответы - главная проблема была в том, что [,. ]*
не сделал то, что я хотел, чтобы он делал,Изменение его на [,. ]+
почти равнялось производительности решения, не основанного на Regex.Использование предварительно скомпилированного регулярного выражения помогло, но оказалось незначительным.(Это решение очень применимо для моей проблемы.
Тестовый код:
Заменить строку на регулярное выражение: [,.] *
Заменить строку на регулярное выражение:[,.] +
Заменить строку на регулярное выражение: [,.] + И предварительно скомпилированный шаблон