Недавно на одном проекте пришлось использовать умный фильтр, где было всего пять свойств, но два из них имели большое количество вариантов значений (около 800). Компонент фильтра при этом грузился около 3 секунд, причем включение и отключение кеша почти не влияло на его производительность. Это сильно портило впечатление от проекта, т.к. фильтр был на главной странице.
Опытным путем я пришел к неожиданному заключению: медленно работают не запросы к базе данных, а компонент просто так долго "думает". В частности, проблема крылась в основном в двух строках в коде компонента (в основном в первой):
Второе неожиданное открытие - эти две строки при всей своей прожорливости к ресурсам, не делают ничего при отсутствии фильтрации (переменная $combo вообще не изменяется, это я проверил сравнением массивов), а сам код предназначен только для того, чтобы отмечать серым цветом неактивные варианты (при отсутствии фильтрации их быть и не должно).
Таким образом, подставив перед foreach условие наличия фильтрации, я полностью избавился от этой головной боли, при этом функциональность компонента ничуть не пострадала:
Из природной скромности пока не решился обращаться с предложением в техподдержку, может кто-то меня поправит, и я сделал все-таки что-то неправильно...
Опытным путем я пришел к неожиданному заключению: медленно работают не запросы к базе данных, а компонент просто так долго "думает". В частности, проблема крылась в основном в двух строках в коде компонента (в основном в первой):
/*Handle disabled for checkboxes (TODO: handle number type)*/ foreach($arResult["ITEMS"] as $PID => $arItem) { $combo = $arResult["COMBO"]; /*filter all possible property values combinations*/ $this->filterCombinations($combo, $arResult["ITEMS"], $PID); // 2.5 секунды $combo = $this->combineCombinations($combo); // 0.5 секунды 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; } } } |
Второе неожиданное открытие - эти две строки при всей своей прожорливости к ресурсам, не делают ничего при отсутствии фильтрации (переменная $combo вообще не изменяется, это я проверил сравнением массивов), а сам код предназначен только для того, чтобы отмечать серым цветом неактивные варианты (при отсутствии фильтрации их быть и не должно).
Таким образом, подставив перед foreach условие наличия фильтрации, я полностью избавился от этой головной боли, при этом функциональность компонента ничуть не пострадала:
/*Handle disabled for checkboxes (TODO: handle number type)*/ if(count($_CHECK)>0) foreach($arResult["ITEMS"] as $PID => $arItem) |
Из природной скромности пока не решился обращаться с предложением в техподдержку, может кто-то меня поправит, и я сделал все-таки что-то неправильно...