Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #31 (permalink)  
Старый 21.01.2012, 12:01
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Сообщение от trikadin Посмотреть сообщение
Было бы неплохо, ибо сам я этого точно не сделаю.
Переписал на while и сравнил по времени выполнения и затратам процессора и памяти. Тестировал на очень слабой машине с 500мб памяти.

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

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

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

Варианты подходят оба.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #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. Причина: никто опечатку не заметил, похоже вообще код не смотрели ;)
Ответить с цитированием
  #33 (permalink)  
Старый 22.01.2012, 15:08
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Gozar,
Ну ты бы сразу сказал бы что для тебя скорость важна... Я бы может чего друго состряпал бы.. Я просто старался не писать лишнего, что бы код был более оптимален, но на про скорость я не задумывался. А так да, чем больше регов, тем дольше все это работает.
Ответить с цитированием
  #34 (permalink)  
Старый 22.01.2012, 15:40
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 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.
Ответить с цитированием
  #35 (permalink)  
Старый 22.01.2012, 15:51
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Сообщение от devote Посмотреть сообщение
Ну ты бы сразу сказал бы что для тебя скорость важна... Я бы может чего друго состряпал бы..
Мне казалось я намекал на скорость:
Сообщение от Gozar Посмотреть сообщение
выглядит идея как-то громоздко
...
Раньше парсил быстрее, но
Я не против если ты сможешь навскидку придумать что-то быстрее. Я даже пока представить ничего не могу.

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

Была у меня ещё одна идея, грузить всё в дерево и затем уже манипулировать DOM, но так я её и не додумал.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #36 (permalink)  
Старый 22.01.2012, 16:05
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Сообщение от nerv_ Посмотреть сообщение
//что вернут скобки?
var x = "Copyright 2003.";
var z = /^.*([0-9]+)/g;
alert(z.exec(x)[1]);
Сначала точка скушает всё вместе с цифирками до последней точки, а затем вернется на один символ назад в сохраненное состояние и получит совпадение с тройкой.

Но вопрос был всё таки только отчасти о регах.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #37 (permalink)  
Старый 22.01.2012, 16:37
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Gozar,
i != i
Ответить с цитированием
  #38 (permalink)  
Старый 22.01.2012, 18:30
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

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

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

P. S. Вообще, то, что по ссылке - ни разу не оптимизированная версия, там просто концепт.
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #39 (permalink)  
Старый 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);
}
Ответить с цитированием
  #40 (permalink)  
Старый 22.01.2012, 19:29
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

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

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

ps: решение мне приснилось, поэтому об оптимизации я и не задумался
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.

Последний раз редактировалось Gozar, 22.01.2012 в 19:31.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Парсинг даты Allan Stark Общие вопросы Javascript 4 30.01.2014 18:57
Парсинг времени Falcon Общие вопросы Javascript 2 20.09.2010 17:23
custom Парсинг HTML нужен Increazon Общие вопросы Javascript 8 15.09.2010 13:23
Ищу скрипт для работы с bbcode mTzen Общие вопросы Javascript 3 13.09.2010 07:17
bbcode, iframe и javascript Dark[Ol(U23)leneri] Я не знаю javascript 0 10.06.2009 19:52