Показать сообщение отдельно
  #32 (permalink)  
Старый 22.01.2012, 15:03
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Всё таки не дала мне покоя эта тема и я переписал 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: к тестам не придираемся, они вполне себе адекватные.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.

Последний раз редактировалось Gozar, 22.01.2012 в 15:55. Причина: никто опечатку не заметил, похоже вообще код не смотрели ;)
Ответить с цитированием