String.replaceAll значительно медленнее, чем выполнение работы самостоятельно

У меня есть старый фрагмент кода, который выполняет поиск и замену токенов в строке.

Он получает карту из пар и в , выполняет итерацию по ним, и для каждой из этих пар выполняет итерацию по целевой строке, ищет из , используя indexOf () и заменяет его значением от до . Он выполняет всю работу с StringBuffer и в конечном итоге возвращает String .

Я заменил этот код этой строкой: replaceAll ("[,.] *", "");
И я провел несколько сравнительных тестов производительности.
При сравнении 1 000 000 итераций я получил следующее:

Старый код: 1287 мс
Новый код: 4605 мс

в 3 раза дольше!

Затем я попытался заменить его тремя вызовами replace :
replace (",", "");
replace (" . "," ");
replace (" "," ");

В результате были получены следующие результаты:

Старый код: 1295
Новый код: 3524

в 2 раза длиннее!

Есть идеи, почему replace и replaceAll так неэффективны? Могу я сделать что-нибудь, чтобы ускорить работу?


Edit: Спасибо за все ответы - главная проблема действительно заключалась в том, что [,. ] * сделал не то, что я хотел. Измените его на [,. ] + почти сравнялся с производительностью решения, не основанного на Regex. Использование предварительно скомпилированного регулярного выражения помогло, но было незначительным. (Это решение очень подходит для моей проблемы.

Тестовый код:
Заменить строку на Regex: [,.] *
Заменить строку на Regex: [,.] +
Заменить строку на Regex : [,.] + и предварительно скомпилированный шаблон

25
задан RonK 8 June 2011 в 19:25
поделиться