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