@KOPC1886

Как ускорить выполнение этого скрипта?

Всем привет!

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

foreach($categories as $i => $objCategory)
            {
                $jsonData[$i]['id'] = $objCategory->id;
                $jsonData[$i]['name'] = $objCategory->name;
                $jsonData[$i]['image'] = $objCategory->image;
                $jsonData[$i]['editors'] = $objCategory->editors;
                $jsonData[$i]['can_edit'] = $objCategory->canEdit;

                $cnt = 0;
                $jsonData[$i]['services'] = array();
                foreach($services as $k => $objService)
                {
                    if($objService->mainCategory == $objCategory->id || in_array($objCategory->id, $objService->additionalCategories))
                    {
                        if(!empty($objCategory->sortingServices))
                        {
                            foreach($objCategory->sortingServices as $index => $serviceId)
                            {
                                if($objService->id == $serviceId)
                                {
                                    $cnt = $index;
                                    break;
                                }
                            }
                        }

                        $jsonData[$i]['services'][$cnt]['id'] = $objService->id;
                        $jsonData[$i]['services'][$cnt]['name'] = $objService->name;
                        $jsonData[$i]['services'][$cnt]['favorite'] = $objService->favorite;
                        $jsonData[$i]['services'][$cnt]['main_category'] = $objService->mainCategory;
                        $jsonData[$i]['services'][$cnt]['tags'] = $objService->tags;
                        $jsonData[$i]['services'][$cnt]['can_read'] = $objService->canRead;
                        $jsonData[$i]['services'][$cnt]['can_edit'] = $objService->canEdit;
                        $jsonData[$i]['services'][$cnt]['can_order'] = $objService->canOrder;

                        ++$cnt;
                    }
                }
                ksort($jsonData[$i]['services']);
            }
  • Вопрос задан
  • 2773 просмотра
Пригласить эксперта
Ответы на вопрос 4
@Nc_Soft
Надо в начало этого кода поместить die()
Ответ написан
Комментировать
Lerg
@Lerg
Defold, Corona, Lua, GameDev
Для начала замените везде $jsonData[$i] на переменную $jsonData_i
$jsonData_i = $jsonData[$i] в начале цикла.

Вместо блока кода с $jsonData[$i]['services'][$cnt] сделайте одну строчку
$services[$cnt] = [
  'id' => $objService->id,
  'name' => $objService->name,
  'favorite' => $objService->favorite,
  'main_category' => $objService->mainCategory,
  'tags' => $objService->tags,
  'can_read' => $objService->canRead,
  'can_edit' => $objService->canEdit,
  'can_order' => $objService->canOrder
];

И после цикла
$jsonData_i['services'] = $services;

Это немного ускорит цикл, но по хорошему нужно прогнать код через profiler, он скажет где именно затыки.
Возможно много времени теряется в функции in_array(), в этом случае additionalCategories нужно сделать ассоциативным массивом.

Просто for цикл вместо foreach тоже должен быть чуть быстрее.
Ответ написан
@Arik
1. На каждую категорию вы полностью прогоняете все сервисы, возможно их можно подготовить до категорий в виде ассоц массив. Или хотя бы unset() уже обработанных сервисов, если они не повторяются.
2. Используете свойства объекта, они существуют или доступ идет через магические методы? Может лучше явно создать методы ->get**() и получать данные через них? Магические методы хорошо тратят время/ресурсы.
3. Может результат просто положить в кэш?
Ответ написан
@asd111
Переходите на hhvm или возьмите php поновее. Либо можно написать модуль для php на С++. С точки зрения логики и кода у вас все норм(на первый взгляд).
Переход с php 5.3 на 5.4 дает сам по себе прирост производительности примерно 15%. А переход на hhvm может дать ещё больший прирост именно на таких задачах - главное в функцию обернуть, тогда это будет скомпилировано и скорость будет соответствующая.

php медленно обрабатывает данные
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы