2013-05-24 18 views
22

私はJMSシリアライザを使用しています。大きなデータを使用するとパフォーマンスが悪いことがわかりました。jmsシリアライザのパフォーマンスの問題

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

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

データは1nまでオブジェクトのリストを指定できます

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

これは私がデータをシリアル化する方法である:私は配列として表示され、次のオブジェクト構造をしました。データに500以上のオブジェクトがあると、パフォーマンスは非常に遅くなります(5秒以上)。 json_encode()を直接使用すると、1秒以上かかることはありません。

JMSシリアライザの使用を改善するにはどうすればよいですか?私は、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; 
} 

注釈なし必要なデータを使用するための準備が整ったからです。

+2

のグループおよび/除外ルールの微調整ミックスから来たあなたはJMSSerializerの部分がxhprofまたはXdebugを使って全体を遅くし、cachegrind/kcachegrind/webgrindされているに検査しようとしたことがありますか?フィルタリングの値や仮想フィールドのような、JMSシリアライザを使用したシリアライゼーションに特殊な問題がありますか? – nifr

+0

私は、jmsシリアライザがリクエストを遅くする部分であることを知りました。私はすべての設定や注釈を設定しません。なぜなら私はDTOオブジェクトを使用しています。私は必要なものを持っているため、設定をする必要はありません。 –

+0

あなたはエンティティをすぐに提供できるので、ここでのパフォーマンスの影響についてのフィードバックをいただけますか? – nifr

答えて

2

残念ながら、このライブラリは本質的にかなり遅いです。そこには多くの再帰があります。

ただし、できることは、RedisまたはMemcacheのいずれかを使用してすべてのクエリをキャッシュすることです。また、あなたのSQLクエリをスマートにすることができます脂肪をトリムしようとします。あなたが必要とする重要なデータをシリアライザに与えるだけで、とにかく使用されないたくさんのデータを通ってトロールされません。

1

部分応答を使用していますか?あなたの問題は実際には非常に明白なようです。私の意見では、あなたのクライアントは、限られた数のアイテムを求めて、必要なときにもっと求める必要があります...

1

私も同じ問題に遭いました。そして、 "最良の回避策"は、生成されたjson Redisで出力し、CRUD Doctrineイベントを特定のエンティティに接続してキャッシュをフラッシュします。

いくつかのヘルプが参照コレクション