2013-05-24 7 views
22

Я использую JMS Serializer. И я узнал, что производительность очень плохая, когда я использую большие данные. Я следующая структура объекта отображается в виде массива:jms serializer проблема с производительностью

$jsonData = array(
    'message' => 'this is a nice message', 
    'data' => array(
     0 => array(
      'firstname' => 'achim', 
      'lastname' => 'menzel' 
     ) 
    ) 
); 

Это, как я сериализовать данные:

$serializer = $this->get('serializer'); 
$encodedJson = $serializer->serialize($jsonData, 'json'); 

$response = new Response($encodedJson); 
$response->headers->set('Content-Type', 'application/json'); 

Данные может быть списком 1 до n объектов. Когда у меня более 500 объектов в данных, производительность очень медленная (более 5 секунд). Когда я использую json_encode() напрямую, это заняло не более 1 секунды.

Как я могу улучшить использование JMS Serializer? Я не думаю, что сериализатор jms не может обрабатывать большие данные.

Это основной класс, который будет использоваться для сериализации:

class JsonData { 

    public $success = false; 
    public $message = ''; 
    public $data; 
    public $responseCode = 200; 
    public $contentType = 'application/json'; 
} 

И в настоящее время этот объект находится внутри $data:

class GuestDTO { 

    private $userid; 
    private $firstname; 
    private $lastname; 
    private $birthday; 
    private $picturemedium; 
    private $picturelarge; 
    private $gender; 
    private $modifydate; 
    private $entries = array(); 
} 

И $entries список объектов из этого класса:

class GuestlistentryDTO extends AbstractGuestDTO{ 

    private $guestlistentryid; 
    private $guestlistid; 
    private $arrivedat; 
    private $bouncername; 
    private $rejectionreason; 
    private $companioncount; 
    private $companioncountcheckin;  
    private $winner; 
    private $vip; 
} 

Без каких-либо комментариев потому что я подготовил мое dto для использования данных по мере необходимости.

+2

Вы пробовали проверки, какие части JMSSerializer замедляются все это с xhprof или Xdebug и похожем на Cachegrind/KCachegrind/webgrind? У вас есть что-то особенное, включенное в вашу сериализацию с помощью JMS-сериализатора - например, значения фильтрации или виртуальные поля? – nifr

+0

Я только узнал, что сериализатор jms - это часть, которая замедляет запрос. Я не устанавливаю никаких настроек или аннотаций, потому что я использую объекты DTO, у которых есть правильные атрибуты, что мне нужно, поэтому мне не нужно устанавливать какие-либо настройки. –

+0

можете ли вы быстро предоставить свою сущность, чтобы я мог дать отзыв о влиянии на производительность здесь? – nifr

ответ

2

К сожалению, эта библиотека по сути довольно медленная. Там много рекурсии.

Однако несколько вещей, которые вы можете сделать, - это кеширование запросов, используя либо Redis, либо Memcache. Вы также можете быть умным с вашими SQL-запросами, попробуйте обрезать жир. Дайте сериализатору важные данные, которые вам нужны, чтобы не тратить много данных, которые в любом случае не будут использоваться.

1

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

1

Я тоже попал в ту же проблему, и «лучшим обходным решением» было создание кеша для сгенерированного json выводить в Redis и подключать события CRUD Doctrine для определенных объектов, чтобы очистить кеш.

Некоторая помощь пришла из тонкой подобранной смеси групп и правила включения/исключения для ссылочных коллекций

Смежные вопросы