21.01.2012, 12:01
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
Сообщение от trikadin
|
Было бы неплохо, ибо сам я этого точно не сделаю.
|
Переписал на while и сравнил по времени выполнения и затратам процессора и памяти. Тестировал на очень слабой машине с 500мб памяти.
Однако с тэстами напряг, т.к. оба варианта в среднем выдают по нолям (0 ms) == сильно форматированная страница форума на 20-40 сообщений. Причем даже без оптимизации, которую я тут по ходу дела сделал для while, разница между вариантами настолько не существенна, что нужен спец. тест чтобы её понять. Скачков процессора и расхода памяти тоже замечено не было. Спец. тест писать точно не буду.
Вывод такой: в данном, конкретном случае разница не существенна. Возможно на каком-то страшном(длинном) форуме выигрыш будет за while, но к жизни это похоже мало имеет отношения.
Всем спасибо за участие вопрос решать дальше смысла нет.
Варианты подходят оба.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
|
|
22.01.2012, 15:03
|
|
猫
|
|
Регистрация: 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.
Причина: никто опечатку не заметил, похоже вообще код не смотрели ;)
|
|
22.01.2012, 15:08
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
Gozar,
Ну ты бы сразу сказал бы что для тебя скорость важна... Я бы может чего друго состряпал бы.. Я просто старался не писать лишнего, что бы код был более оптимален, но на про скорость я не задумывался. А так да, чем больше регов, тем дольше все это работает.
|
|
22.01.2012, 15:40
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Позволю себе заметить, что от качества реги тоже многое зависит. Я, например, не смог правильно ответить на этот вопрос
//что вернут скобки?
var x = "Copyright 2003.";
var z = /^.*([0-9]+)/g;
alert(z.exec(x)[1]);
хотя, он представляет собой один из принципов механизма работы регулярный выражений, что, на мой взгляд, достаточно важно.
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Последний раз редактировалось nerv_, 22.01.2012 в 15:44.
|
|
22.01.2012, 15:51
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
Сообщение от devote
|
Ну ты бы сразу сказал бы что для тебя скорость важна... Я бы может чего друго состряпал бы..
|
Мне казалось я намекал на скорость:
Сообщение от Gozar
|
выглядит идея как-то громоздко
...
Раньше парсил быстрее, но
|
Я не против если ты сможешь навскидку придумать что-то быстрее. Я даже пока представить ничего не могу.
Сообщение от nerv_
|
Позволю себе заметить, что от качества реги тоже многое зависит.
|
Этим ты глаза вряд ли кому-то откроешь. Да и дело не в реге, а в подходе. Я за регу спокоен, а вот структура кода меня беспокоила.
Была у меня ещё одна идея, грузить всё в дерево и затем уже манипулировать DOM, но так я её и не додумал.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
|
|
22.01.2012, 16:05
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
Сообщение от nerv_
|
//что вернут скобки?
var x = "Copyright 2003.";
var z = /^.*([0-9]+)/g;
alert(z.exec(x)[1]);
|
Сначала точка скушает всё вместе с цифирками до последней точки, а затем вернется на один символ назад в сохраненное состояние и получит совпадение с тройкой.
Но вопрос был всё таки только отчасти о регах.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
|
|
22.01.2012, 16:37
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
Gozar,
i != i
|
|
22.01.2012, 18:30
|
|
Модератор
|
|
Регистрация: 27.04.2010
Сообщений: 3,417
|
|
Gozar, я наконец дошёл до разбирания того, что ты написал...
Хорошая идея, мне нравится.
P. S. Вообще, то, что по ссылке - ни разу не оптимизированная версия, там просто концепт.
|
|
22.01.2012, 19:14
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
Gozar,
как вариант ...
var i = true;
function fuRep(){
i = true;
}
while (i) {
i = false;
str = str.replace(rega, fuRep);
}
|
|
22.01.2012, 19:29
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
Сообщение от рони
|
как вариант ...
|
Хорошая оптимизация, по крайней мере сокращаем одну переменную, на скорости правда это не отразилось, может мало циклов, но на читабельности хорошо.
Да, мне нравится.
ps: решение мне приснилось, поэтому об оптимизации я и не задумался
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Последний раз редактировалось Gozar, 22.01.2012 в 19:31.
|
|
|
|