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