Цитата:
Однако с тэстами напряг, т.к. оба варианта в среднем выдают по нолям (0 ms) == сильно форматированная страница форума на 20-40 сообщений. Причем даже без оптимизации, которую я тут по ходу дела сделал для while, разница между вариантами настолько не существенна, что нужен спец. тест чтобы её понять. Скачков процессора и расхода памяти тоже замечено не было. Спец. тест писать точно не буду. Вывод такой: в данном, конкретном случае разница не существенна. Возможно на каком-то страшном(длинном) форуме выигрыш будет за while, но к жизни это похоже мало имеет отношения. Всем спасибо за участие вопрос решать дальше смысла нет. Варианты подходят оба. |
Всё таки не дала мне покоя эта тема и я переписал while.
Результаты такие: Если в while использовать регу, то разницы между рекурсией и while никакой нет. 221 - 300 ms 220 - 340 ms на 300 циклах for. Однако, путём хитрой оптимизации можно сильно ускорить while. Нужно просто полностью отказаться от проверки реги в нём. Результат не заставил себя ждать: 145ms - 176ms trikadin, этот ответ специально для тебя, ну и ещё тех кто поймет твой код по ссылке: Цитата:
var i = 0, j = 0; function fuRep(){ i = 1; } while (i != j) { i = 0, j = 0; str = str.replace(rega, fuRep); } Смысл сего: гоняем цикл если совпадение есть, если нет то не гоняем, таким образом проверочная рега только одна, дополнительных не нужно. Предполагается что дополнительная уже была и мы знаем что в коде есть BB коды. Таким образом мы разбираемся со вложенностью. Решение может и не очень красивое, но прирост скорости на лицо. ps: к тестам не придираемся, они вполне себе адекватные. |
Gozar,
Ну ты бы сразу сказал бы что для тебя скорость важна... Я бы может чего друго состряпал бы.. Я просто старался не писать лишнего, что бы код был более оптимален, но на про скорость я не задумывался. А так да, чем больше регов, тем дольше все это работает. |
Позволю себе заметить, что от качества реги тоже многое зависит. Я, например, не смог правильно ответить на этот вопрос
//что вернут скобки? var x = "Copyright 2003."; var z = /^.*([0-9]+)/g; alert(z.exec(x)[1]); хотя, он представляет собой один из принципов механизма работы регулярный выражений, что, на мой взгляд, достаточно важно. |
Цитата:
Цитата:
Цитата:
Была у меня ещё одна идея, грузить всё в дерево и затем уже манипулировать DOM, но так я её и не додумал. |
Цитата:
Но вопрос был всё таки только отчасти о регах. |
Gozar,
:victory: i != i ;) |
Gozar, я наконец дошёл до разбирания того, что ты написал...
Хорошая идея, мне нравится. P. S. Вообще, то, что по ссылке - ни разу не оптимизированная версия, там просто концепт. |
Gozar,
как вариант ... var i = true; function fuRep(){ i = true; } while (i) { i = false; str = str.replace(rega, fuRep); } |
Цитата:
Да, мне нравится. ps: решение мне приснилось, поэтому об оптимизации я и не задумался :) |
Часовой пояс GMT +3, время: 23:44. |