Сначала хотел ответить , а потом понял, что надо написать отдельный пост.
У меня последняя версия инфоблоков (12.5.6 от 05.07.2013), хорошее железо, и тоже тормозит умный фильтр.
В разделе 500 ноутбуков по 56 свойств. Строится 7 секунд:
Запросов к базе не делает. Где тормозит?
Здесь:
А конкретно:
Этот код перебирает для всех возможных вариантов значений свойства, все возможные варианты значений для других свойств, чтобы их подсветить.
Непонятно зачем нужно перебирать всё, когда фильтр не выбран. Поэтому добавил условие if ($_CHECK) :
Результат 0.0095 с, если пользователь (или бот) просто зашел на страницу без выбора фильтра:

К сожалению, проблему так просто не решить. Это код надо обязательно переписать. Ведь при выборе фильтра все-равно есть тормоза:

Время работы умного фильтра зависит не от количества товаров или количества свойств. А от количества комбинаций значений свойств.
Ответ техподдержки #411370 :
Разработчику известно об этой проблеме, но в настоящее время исправление логики работы умного фильтра не планируется. Заявка в отделе разработки была закрыта без исправления.
Номер обращения в разработку: 38832.
У меня последняя версия инфоблоков (12.5.6 от 05.07.2013), хорошее железо, и тоже тормозит умный фильтр.
В разделе 500 ноутбуков по 56 свойств. Строится 7 секунд:
Запросов к базе не делает. Где тормозит?
Здесь:
foreach($arResult["ITEMS"] as $PID => $arItem)
{
$combo = $arResult["COMBO"];
/*filter all possible property values combinations*/
$this->filterCombinations($combo, $arResult["ITEMS"], $PID);
$combo = $this->combineCombinations($combo);
foreach($arItem["VALUES"] as $key => $ar)
{
if($arItem["PROPERTY_TYPE"] != "N" && !isset($arItem["PRICE"]))
{
if(!is_array($combo[$PID]) || !in_array($ar["VALUE"], $combo[$PID]))
$arResult["ITEMS"][$PID]["VALUES"][$key]["DISABLED"] = true;
}
}
}
|
А конкретно:
$this->filterCombinations($combo, $arResult["ITEMS"], $PID); |
Этот код перебирает для всех возможных вариантов значений свойства, все возможные варианты значений для других свойств, чтобы их подсветить.
Непонятно зачем нужно перебирать всё, когда фильтр не выбран. Поэтому добавил условие if ($_CHECK) :
if ( $_CHECK )
{
foreach($arResult["ITEMS"] as $PID => $arItem)
{
$combo = $arResult["COMBO"];
/*filter all possible property values combinations*/
$this->filterCombinations($combo, $arResult["ITEMS"], $PID);
$combo = $this->combineCombinations($combo);
foreach($arItem["VALUES"] as $key => $ar)
{
if($arItem["PROPERTY_TYPE"] != "N" && !isset($arItem["PRICE"]))
{
if(!is_array($combo[$PID]) || !in_array($ar["VALUE"], $combo[$PID]))
$arResult["ITEMS"][$PID]["VALUES"][$key]["DISABLED"] = true;
}
}
}
}
|
Результат 0.0095 с, если пользователь (или бот) просто зашел на страницу без выбора фильтра:

К сожалению, проблему так просто не решить. Это код надо обязательно переписать. Ведь при выборе фильтра все-равно есть тормоза:

Время работы умного фильтра зависит не от количества товаров или количества свойств. А от количества комбинаций значений свойств.
Ответ техподдержки #411370 :
Разработчику известно об этой проблеме, но в настоящее время исправление логики работы умного фильтра не планируется. Заявка в отделе разработки была закрыта без исправления.
Номер обращения в разработку: 38832.
