Всё таки не дала мне покоя эта тема и я переписал while.
Результаты такие:
Если в while использовать регу, то разницы между рекурсией и while никакой нет.
221 - 300 ms
220 - 340 ms
на 300 циклах for.
Однако, путём хитрой оптимизации можно сильно ускорить while. Нужно просто полностью отказаться от проверки реги в нём. Результат не заставил себя ждать:
145ms - 176ms
trikadin, этот ответ специально для тебя, ну и ещё тех кто поймет твой код по ссылке:
Сообщение от trikadin
|
Можно делать так, как тут. То есть в цикле убираем самые вложенные (путём замены их на нормальные теги) и цикл гоняем до тех пор, пока можем найти хоть один непреобразованный bb-код.
|
Сделать это можно следующим образом:
var i = 0,
j = 0;
function fuRep(){
i = 1;
}
while (i != j) {
i = 0, j = 0;
str = str.replace(rega, fuRep);
}
Смысл сего: гоняем цикл если совпадение есть, если нет то не гоняем, таким образом проверочная рега только одна, дополнительных не нужно. Предполагается что дополнительная уже была и мы знаем что в коде есть BB коды.
Таким образом мы разбираемся со вложенностью.
Решение может и не очень красивое, но прирост скорости на лицо.
ps: к тестам не придираемся, они вполне себе адекватные.