Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> unset(): влияние на скорость работы скрипта 
:(
    Опции темы
Leklerk
Дата 8.10.2009, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 31.7.2009
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Допустим нужно заменить в строке символы BBCode b, /b на <b>, </b>. При этом заменяем только пары b, /b, а открывающие без закрывающих и закрывающие без открывающих игнорируем. Сделал так
Код

// создаем массив вхождений для b
$pos_start = 0;
while (strpos($str, '', $pos_start) !== false)
{
    $pos = strpos($str, '[b]', $pos_start);
    $opened_tags[] = $pos;
    $pos_start = $pos + 1;
}

// создаем массив вхождений для /b
$pos_start = 0;
while (strpos($str, '
', $pos_start) !== false)
{
    $pos = strpos($str, '[/b]', $pos_start);
    $closed_tags[] = $pos;
    $pos_start = $pos + 1;
}

// Заменяем каждую "правильную" пару b /b на пару <b></b>
for ($i=0, $count=count($opened_tags); $i<$count; $i++)
{
    foreach ($closed_tags as $v)
    {
        if ($v > $opened_tags[$i]) 
        {
            $val = $v;
            break;
        }
    }
    
    if (isset($val))
    {
        if ($i==$count-1 || $val < $opened_tags[$i+1])
        {
            $str = substr_replace($str, '<b>', $opened_tags[$i], 3);
            $str = substr_replace($str, '</b>', $val, 4);
        }
    }
    unset($val);
}

Однако не слишком ли замедляет скрипт частый вызов unset()? 
P.S. Там где while, стоят b в скобках, а не ''.


Это сообщение отредактировал(а) Leklerk - 8.10.2009, 10:27
PM MAIL ICQ   Вверх
NewDima
Дата 8.10.2009, 10:25 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: 10
Всего: 12



Leklerk, проверь и узнаешь
PM ICQ   Вверх
Ипатьев
Дата 8.10.2009, 10:31 (ссылка) |    (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



вот удивительно
в коде используется десяток функций и алгоритмов. и кавычки, разумеется, присутствуют
но выбор пал только на одну из них
мне страшно интересно, чем руководствуются горе-оптимизаторы, выбирая  объект своей страсти.
одному длина имени переменной не угодила. другому - название оператора цикла. третий озаботился ансетом.
почему не strpos? почему не foreach? почему не наличие пробелов и пустых строк?
загадка.
PM MAIL   Вверх
Leklerk
Дата 8.10.2009, 11:19 (ссылка)   | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 31.7.2009
Где: Санкт-Петербург

Репутация: нет
Всего: нет



NewDima, как-нибудь попробую. Есть просто стандартные грубые ошибки, например, повсеместное использование рег. выражений или 
Код

for ($i=0; $i<count($array); $i++)
 
вместо
Код

for ($i=0, $count=count($array); $i<$count; $i++)

Я и подумал, может удалением переменных тоже не стоит злоупотреблять...

Это сообщение отредактировал(а) Leklerk - 8.10.2009, 11:19
PM MAIL ICQ   Вверх
NewDima
Дата 8.10.2009, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: 10
Всего: 12



Leklerk, не стоит, когда речь идет о небольших объемах обрабатываемых данных.
И постарайся понять, что тебе сказал Ипатьев, он у нас критик. Твой алгоритм нерпоизводителен
PM ICQ   Вверх
Ипатьев
Дата 8.10.2009, 12:01 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



ахаха, все-таки не единственная забота об оптимизиции. еще count в цикле smile)))

вот удивительно, насколько живучи дремучие заблуждения.
"стандартные грубые ошибки".
это ж надо. удар по производительности. зависание сервера и финансовый крах - не меньше - ждут проект, если он не исправит эти ошибки.

в подавляющем большинстве случаев обе "стандартные грубые ошибки" (не, ну надо ж так назвать-то!) никакого влияния на производительность системы не оказывают.
а в некоторых случаях приводят к противоположному результату, который мы видим здесь во всей красе:
из за боязни регулярных выражений пишется два цикла... дублирующих друг друга smile

я не знаю, нужны какие-то жесткие правила. 
это же один из самых распространенных вопросов на форуме.
я тут сравнительно недавно, но буквально каждые два дня появляются вопросы по такой вот "оптимизации".
PM MAIL   Вверх
Ипатьев
Дата 8.10.2009, 12:18 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



а ведь для 5 тегов текст будет перебираться по одной букве 10 раз.
это уже не смешно
уж хотя бы за один проход можно было найти все теги вместе, и открывающие и закрывающие?

и ведь не возникает у них в голове вопрос "оптимален ли алгоритм". вообще не возникает, никогда.  ни одного вопроса по поводу оптимальности алгоритма я здесь не видел
к вопросу об алгоритмах и их нужности среднему пхп-пользователю.
PM MAIL   Вверх
lelik133
Дата 8.10.2009, 12:54 (ссылка)  | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 517
Регистрация: 5.2.2003
Где: Москва

Репутация: 5
Всего: 14



//оффтоп да не умеет средний пхп-пользователь придумывать алгоритмы, а умеет только кодить, часто методом copy-paste. поэтому такие и вопросы... 
PM ICQ   Вверх
youri
Дата 8.10.2009, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 6
Всего: 16



Цитата(Ипатьев @  8.10.2009,  12:01 Найти цитируемый пост)
вот удивительно, насколько живучи дремучие заблуждения

ну они просто где-то написаны, например, в правилах хорошего кода lol. Причем по теме важно было только одну вещь сказать (ну, как максимум, оттуда можно себе coding style придумать, выборочно). Но, например, после моей характеристики темы (хотя не совсем моей) пришли люди каждый со своим coding style и начали доказывать, какие кавычки круче

а вообще, видимо этот код просто негде протестировать в реальных условиях. Поэтому по-хорошему надо сэмулировать реальные условия, чтобы найти узкое место. А это сложнее, чем вынести какой-нибудь count за цикл или прочитать статью типа этой. Почему выбор пал на unset - это для меня загадка, интересно было бы услышать объяснение
PM   Вверх
nerezus
Дата 9.10.2009, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 12
Всего: 43



Цитата

в правилах хорошего кода
 я бы не стал ориентироваться на эту тему ;)


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Leklerk
Дата 9.10.2009, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 31.7.2009
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата

Почему выбор пал на unset 

Да он в общем и не пал...
Были сомнения по поводу того, насколько оправданно удалять переменные в большом количестве - если их, скажем, будет несколько тысяч.


PM MAIL ICQ   Вверх
Ипатьев
Дата 9.10.2009, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



их не будет несколько тысяч
переменная $val - одна.

Добавлено через 14 минут и 36 секунд
Откуда в тексте возьмется несколько тысяч бб-кодов - вопрос задавать, как я понимаю, бессмысленно.

youri, мда, загрузили вы меня этими ссылками. Сказать по правде, не всё я осилил. Но, насколько я понял, в части тем речь идет о coding standards, а это совсем другое. Самое ужасное - по последней ссылке. Я эту статью, кстати, кажется где-то уже видел. Типичные рассуждения начинающего программиста, не имеющего представления о реальных причинах снижения производительности и о путях ее повышения.
PM MAIL   Вверх
Leklerk
Дата 9.10.2009, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 31.7.2009
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Количество инициализаций и удалений $val зависит от размеров $tags_closed, $tags_opened. Когда я писал о тысячах, имел в виду понятно не этот код.

Это сообщение отредактировал(а) Leklerk - 9.10.2009, 11:08
PM MAIL ICQ   Вверх
Ипатьев
Дата 9.10.2009, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



Правильно. 
но выше-то вы писали, что переменных много:
Цитата(Leklerk @  9.10.2009,  10:28 Найти цитируемый пост)
насколько оправданно удалять переменные в большом количестве - если их, скажем, будет несколько тысяч.

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

unset вам нужен для логики кода.
лично я бы делал просто переменную флаг
но и с unset вряд ли будут какие-то проблемы

вопрос о тысячах итераций остается открытым

Добавлено @ 11:27
что-то я вообще ту логику не понял.
что там делает этот foreach? который задает $val 
мы каждый раз перебираем массив $closed_tags по алгоритму Шлёмы-рисовальщика?

Это сообщение отредактировал(а) Ипатьев - 9.10.2009, 11:27
PM MAIL   Вверх
Leklerk
Дата 9.10.2009, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 31.7.2009
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата

unset вам нужен для логики кода.

Совершенно верно.
Цитата

что там делает этот foreach? 

Делает он вот что. Для каждого откр. тега $opened_tags[$i] ищет ближайший закр. тег.
Цитата

вопрос о тысячах итераций остается открытым

Я всё сказал.


Это сообщение отредактировал(а) Leklerk - 9.10.2009, 11:40
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0853 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.