У меня есть старый фрагмент кода, который выполняет поиск и замену токенов внутри строки.
Он получает карту пар 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: [,. ] + и предварительно скомпилированный шаблон