Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Парсинг BBcode (https://javascript.ru/forum/misc/24939-parsing-bbcode.html)

Gozar 21.01.2012 12:01

Цитата:

Сообщение от trikadin (Сообщение 151801)
Было бы неплохо, ибо сам я этого точно не сделаю.

Переписал на while и сравнил по времени выполнения и затратам процессора и памяти. Тестировал на очень слабой машине с 500мб памяти.

Однако с тэстами напряг, т.к. оба варианта в среднем выдают по нолям (0 ms) == сильно форматированная страница форума на 20-40 сообщений. Причем даже без оптимизации, которую я тут по ходу дела сделал для while, разница между вариантами настолько не существенна, что нужен спец. тест чтобы её понять. Скачков процессора и расхода памяти тоже замечено не было. Спец. тест писать точно не буду.

Вывод такой: в данном, конкретном случае разница не существенна. Возможно на каком-то страшном(длинном) форуме выигрыш будет за while, но к жизни это похоже мало имеет отношения.

Всем спасибо за участие вопрос решать дальше смысла нет.

Варианты подходят оба.

Gozar 22.01.2012 15:03

Всё таки не дала мне покоя эта тема и я переписал while.

Результаты такие:

Если в while использовать регу, то разницы между рекурсией и while никакой нет.

221 - 300 ms
220 - 340 ms

на 300 циклах for.

Однако, путём хитрой оптимизации можно сильно ускорить while. Нужно просто полностью отказаться от проверки реги в нём. Результат не заставил себя ждать:

145ms - 176ms

trikadin, этот ответ специально для тебя, ну и ещё тех кто поймет твой код по ссылке:

Цитата:

Сообщение от trikadin (Сообщение 151550)
Можно делать так, как тут. То есть в цикле убираем самые вложенные (путём замены их на нормальные теги) и цикл гоняем до тех пор, пока можем найти хоть один непреобразованный bb-код.

Сделать это можно следующим образом:

var i = 0, 
    j = 0;

function fuRep(){
    i = 1;
}

while (i != j) {
    i = 0, j = 0;
    str = str.replace(rega, fuRep);
}


Смысл сего: гоняем цикл если совпадение есть, если нет то не гоняем, таким образом проверочная рега только одна, дополнительных не нужно. Предполагается что дополнительная уже была и мы знаем что в коде есть BB коды.

Таким образом мы разбираемся со вложенностью.

Решение может и не очень красивое, но прирост скорости на лицо.

ps: к тестам не придираемся, они вполне себе адекватные.

devote 22.01.2012 15:08

Gozar,
Ну ты бы сразу сказал бы что для тебя скорость важна... Я бы может чего друго состряпал бы.. Я просто старался не писать лишнего, что бы код был более оптимален, но на про скорость я не задумывался. А так да, чем больше регов, тем дольше все это работает.

nerv_ 22.01.2012 15:40

Позволю себе заметить, что от качества реги тоже многое зависит. Я, например, не смог правильно ответить на этот вопрос
//что вернут скобки?
var x = "Copyright 2003.";
var z = /^.*([0-9]+)/g;
alert(z.exec(x)[1]);

хотя, он представляет собой один из принципов механизма работы регулярный выражений, что, на мой взгляд, достаточно важно.

Gozar 22.01.2012 15:51

Цитата:

Сообщение от devote (Сообщение 152132)
Ну ты бы сразу сказал бы что для тебя скорость важна... Я бы может чего друго состряпал бы..

Мне казалось я намекал на скорость:
Цитата:

Сообщение от Gozar (Сообщение 151466)
выглядит идея как-то громоздко
...
Раньше парсил быстрее, но

Я не против если ты сможешь навскидку придумать что-то быстрее. Я даже пока представить ничего не могу.

Цитата:

Сообщение от nerv_ (Сообщение 152140)
Позволю себе заметить, что от качества реги тоже многое зависит.

Этим ты глаза вряд ли кому-то откроешь. Да и дело не в реге, а в подходе. Я за регу спокоен, а вот структура кода меня беспокоила.

Была у меня ещё одна идея, грузить всё в дерево и затем уже манипулировать DOM, но так я её и не додумал.

Gozar 22.01.2012 16:05

Цитата:

Сообщение от nerv_ (Сообщение 152140)
//что вернут скобки?
var x = "Copyright 2003.";
var z = /^.*([0-9]+)/g;
alert(z.exec(x)[1]);

Сначала точка скушает всё вместе с цифирками до последней точки, а затем вернется на один символ назад в сохраненное состояние и получит совпадение с тройкой.

Но вопрос был всё таки только отчасти о регах.

рони 22.01.2012 16:37

Gozar,
:victory: i != i ;)

trikadin 22.01.2012 18:30

Gozar, я наконец дошёл до разбирания того, что ты написал...

Хорошая идея, мне нравится.

P. S. Вообще, то, что по ссылке - ни разу не оптимизированная версия, там просто концепт.

рони 22.01.2012 19:14

Gozar,
как вариант ...
var i = true;
function fuRep(){
    i = true;
}
while (i) {
    i = false;
    str = str.replace(rega, fuRep);
}

Gozar 22.01.2012 19:29

Цитата:

Сообщение от рони (Сообщение 152174)
как вариант ...

Хорошая оптимизация, по крайней мере сокращаем одну переменную, на скорости правда это не отразилось, может мало циклов, но на читабельности хорошо.

Да, мне нравится.

ps: решение мне приснилось, поэтому об оптимизации я и не задумался :)


Часовой пояс GMT +3, время: 23:44.