Оптимизация рекурсивной функции на php

12
[umka]
На сайте с 25.05.2008
Offline
456
#11
_voland_:
В один проход вызывается от 2 до 10 функций рекурсивно.. глубино рекурсии до 7.

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

Я имел в виду общее количество итераций за один вызов скрипта.

Мне тоже кажется, что оно у вас работает подозрительно медленно.

Лог в помощь!
_
На сайте с 09.06.2008
Offline
158
#12
'[umka:
;7605641']Я имел в виду общее количество итераций за один вызов скрипта.
Мне тоже кажется, что оно у вас работает подозрительно медленно.

Ну в среднем 5 за раз, 7 рекурсий - итого 35 раз.. совсем не много..

Настраиваю напильником Joomla 1.5 (http://joomla15.ru) Если постоянно взламывают движок, достаточно сменить хостинг (http://2s4.ru/ytx) всем СРОЧНО (14 дек) обновлять или патчить joomla-сайты (/ru/forum/919351)
dvaes
На сайте с 03.09.2007
Offline
65
#13

не может такого быть. чтоб оно выполнялось 10 секунд

D5
На сайте с 01.06.2004
Offline
51
#14
_voland_:

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

Можно не менять структуру, но снизить сложность до 1 прохода по списку. Для этого правда нужно ввести отдельный индекс (сортированный список), в котором проиндексировать каждый каталог со списком всех своих чилдов, что-то типа:

categoryA, categoryB

categoryA, categoryC

categoryA, categoryD

..

Такой индекс можно рассчитывать заранее и хранить в отдельной таблице или еще как.

Имея дело с деревом adjacency list от рекурсии можно избавится только вот такими ухищрениями, которые имеют свою цену. Например, более сложное обновление каталогов.

Программирование сайтов (http://lindir.ru)
_
На сайте с 09.06.2008
Offline
158
#15

В итоге, благодаря еще одному рецепту удалось снизить время выполнения до 0,2-0,6 сек (VDS 1700МГц)

_voland_ добавил 13.09.2010 в 21:11

dk547:
Можно не менять структуру, но снизить сложность до 1 прохода по списку. Для этого правда нужно ввести отдельный индекс (сортированный список), в котором проиндексировать каждый каталог со списком всех своих чилдов, что-то типа:

categoryA, categoryB
categoryA, categoryC
categoryA, categoryD
..

Такой индекс можно рассчитывать заранее и хранить в отдельной таблице или еще как.
Имея дело с деревом adjacency list от рекурсии можно избавится только вот такими ухищрениями, которые имеют свою цену. Например, более сложное обновление каталогов.

Спасиб, вариант, если каталог разрастется - придется использовать

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий