Форум программистов, компьютерный форум, киберфорум
Наши страницы
1С Битрикс
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
Revyakins
1 / 1 / 0
Регистрация: 07.05.2016
Сообщений: 29
1

Оптимизация кода

16.05.2016, 11:43. Просмотров 1009. Ответов 5
Метки нет (Все метки)

Добрый день, уважаемые форумчане!
Имеется такой код:


PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$IBLOCK_ID = 1; 
 
$arFilter = Array('IBLOCK_ID'=>$IBLOCK_ID, 'GLOBAL_ACTIVE'=>'Y'); 
 
$db_list = CIBlockSection::GetList(Array($by=>$order), $arFilter, true); 
 
while($ar_result = $db_list->GetNext()) 
 
{ 
 
echo '<b>'.$ar_result['NAME'].'</b><br />'; 
 
$arSelect = Array("ID", "NAME", "DATE_ACTIVE_FROM"); 
 
$arFilter = Array("IBLOCK_ID"=>$IBLOCK_ID, "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y", "SECTION_ID" => $ar_result['ID']); 
 
$res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect); 
 
while($ob = $res->GetNextElement()) 
 
{ 
 
$arFields = $ob->GetFields(); 
 
echo $arFields['NAME']; 
 
} 
 
}
//
//Есть вот такой код. Работает очень медленно. Необходимо его ускорить, при этом чтобы не изменился
//вывод на экран (чтобы функционально было тоже самое).
//Предположим, что у нас в инфоблоке 435 разделов, и в каждом от 10 до 645 элементов


Как реализовать? Помогите, пожалуйста.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2016, 11:43
Ответы с готовыми решениями:

Оптимизация методом Ньютона (нахождение точки минимума). Оптимизация кода
MATLAB только начал осваивать. Попытался реализовать нахождение точки минимума методом Ньютона...

Оптимизация кода. Замер времени выполнения части кода.
Доброе утро. Есть желание посмотреть сколько времени занимает выполнение какого-то блока...

Типы оптимизация: черная оптимизация, серая оптимизация и белая оптимизация
Много много лет назад, на заре становления профессии &quot;оптимизатора&quot; в какой то умной книжке был...

Оптимизация кода
Есть форма http://codepen.io/Ksop/pen/EgkYQy в которой есть 2 счетчика для указания количества...

Оптимизация кода
Здравствуйте! Во время написания кода задался вопросом: А &quot;правильно&quot; ли я все делаю? Не хотелось...

5
voral
952 / 640 / 144
Регистрация: 16.03.2008
Сообщений: 3,042
16.05.2016, 14:19 2
Ну так естественно. Так нещадно гоняете.
Разбейте выполнение на два этапа:
1. Запрашиваете список разделов CIBlockSection::GetList и собираете в один массив все ID
2. Запрашиваете список элементов CIBlockElement::GetList (только один раз) в SECTION_ID передаете массив сформированный на первом этапе. Результат в цикле раскладываете в двухуровневый массив. Где в качестве ключа первого уровня ID раздела. а в качестве значения набираете массив элементов.
3. Просто вывод

Все это покрываете кэшированием с долгим сроком жизни. При необходимости сбрасываете кеш по тегу.

Вообще довольно странный код:
Вам действительно нужна все элементы разом?
1
Revyakins
1 / 1 / 0
Регистрация: 07.05.2016
Сообщений: 29
16.05.2016, 15:02  [ТС] 3
voral, получается, мне нужно сделать так
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$IBLOCK_ID = 1; 
 
$arFilter = Array('IBLOCK_ID'=>$IBLOCK_ID, 'GLOBAL_ACTIVE'=>'Y'); 
 
$db_list = CIBlockSection::GetList(Array($by=>$order), $arFilter, true); 
 
while($ar_result = $db_list->GetNext())  {
 $SectionID[] = $ar_result['ID'];
} 
 
 
$arSelect = Array("ID", "NAME", "DATE_ACTIVE_FROM"); 
 
$arFilter = Array("IBLOCK_ID"=>$IBLOCK_ID, "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y", "SECTION_ID" => $ar_result['ID']); 
 
$res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect); 
while($ob = $res->GetNextElement()) {
примерно так? мне НЕ НУЖНО использовать вложенные циклы while? (т.е. их нужно использовать по отдельности?)

Немного не понял по поводу "Результат в цикле раскладываете в двухуровневый массив. Где в качестве ключа первого уровня ID раздела. а в качестве значения набираете массив элементов.
3. Просто вывод"

как это реализовать?
0
voral
952 / 640 / 144
Регистрация: 16.03.2008
Сообщений: 3,042
16.05.2016, 15:15 4
Лучший ответ Сообщение было отмечено Revyakins как решение

Решение

Примерно так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?
    // кэшировать от сих
    $IBLOCK_ID = 1; 
    $arFilter = Array('IBLOCK_ID'=>$IBLOCK_ID, 'GLOBAL_ACTIVE'=>'Y'); 
    $db_list = CIBlockSection::GetList(Array($by=>$order), $arFilter, true);  // здесь желательно так же задать массив необходимых полей
    $arSections = array();
    $arElements = array();
    while($ar_result = $db_list->GetNext()) 
    { 
        $arSections[$ar_result['ID']] = $ar_result;
        $arElements[$ar_result['ID']] = array();
    } 
 
    $arSelect = Array("ID", "NAME", "DATE_ACTIVE_FROM"); 
    $arFilter = Array("IBLOCK_ID"=>$IBLOCK_ID, "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y", "SECTION_ID" => array_keys($arSections)); 
    $res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect); 
    while($ar_result = $db_list->GetNext()) 
    { 
        // обратите нимание этот код раскладывает элементы только по разделам, которые
        // считаются осноными для конкретного элемента
        // если у вас элемент может быть привязан к нескольким разделам - необходимо
        // пройтись по списку разделов к которым элемент привязан
        $arElements[$ar_result['IBLOCK_SECTION_ID']][] = $ar_result;
    } 
    // кэшировать до сих
    foreach ($arSections as $sectionID => $arSection)
    { 
        echo '<b>'.$arSection['NAME'].'</b><br />'; 
        if (count($arElements[$sectionID]) >0 )
        {
            foreach($arElements[$sectionID] as $arElement)
            { 
                echo $arElement['NAME']; 
            } 
        }
    } 
?>
1
Revyakins
1 / 1 / 0
Регистрация: 07.05.2016
Сообщений: 29
16.05.2016, 16:26  [ТС] 5
voral, спасибо большое!
Реально очень помогли!

Добавлено через 55 минут
voral, немного не понял только по этому участку кода

PHP
1
 $arElements[$ar_result['ID']] = array();
0
voral
952 / 640 / 144
Регистрация: 16.03.2008
Сообщений: 3,042
16.05.2016, 16:37 6
Просто для каждого раздела инициализируется массив элементов (пустым массивом).
Ибо, например, кода только начали обрабатывать элементы и $arElements[$ar_result['IBLOCK_SECTION_ID']] еще не существует. PHP конечно это "проглотит", но строго говоря это обращение к несуществующей переменной.
PHP
1
$arElements[$ar_result['IBLOCK_SECTION_ID']][] = $ar_result;
1
16.05.2016, 16:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2016, 16:37

Оптимизация кода
Помогите хотя бы начать оптимизировать Суть проста, есть код игры &quot;морской бой&quot; js - canvas, его...

Оптимизация кода
Как можно оптимизировать следующий код: if Column.FieldName = 'CLI_TEXT' then begin s:=...

Оптимизация кода
В С++ я совсем недавно, вот задали задачку: Перемножить 2 матрицы MxМ, элементами которых...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru