1

I have the following two code. Which code is good in terms of performance?

$gd = $this->getDoctrine();
$em = $gd->getEntityManager();
$data = $gd->getRepository('MyB:MyC')->find...;
// update $data.
$em->persist($data);
$em->flush();

I want to know its memory usage and execution speed.

$data = $this->getDoctrine()->getRepository('MyB:MyC')->find...;
// update $data.
$this->getDoctrine()->getEntityManager()->persist($data);
$this->getDoctrine()->getEntityManager()->flush();
4

2 に答える 2

1

簡単な答え: ほとんどの場合、前者の方が高速ですが、より多くのメモリを消費します。

tl;dr

基礎となるgetDoctrine()機能に応じて、2 番目のメソッドは実行時にメソッド呼び出しのオーバーヘッドを少なくとも追加します。

メソッドが計算を行い、キャッシュ メカニズムを持たない場合は、このためにコール スタック全体をトレースする必要もあります。

メモリ フットプリントとパフォーマンス オーバーヘッドの間には常にトレードオフがあります。

編集

悪いケース: 後者は、getter を呼び出すたびに、何らかの基礎となるデータのインスタンスを作成します。これはパフォーマンスに役立ちません。ヒープ スパイクが発生することさえあります。

最良のケース: getter へのすべてのサブシーケンス呼び出しが同じオブジェクトにアクセスしています。これは、DAO または SQL ヘルパーでは実際には非常にまれであり、親オブジェクト内に参照が保持されているという理由だけで、最初の呼び出しとまったく同じメモリを消費します。

この場合の私の提案は、最初のものを使用することです。

于 2012-12-06T09:00:54.007 に答える
1

とても簡単に調べることができます

memory_get_peak_usage ()

http://php.net/manual/function.memory-get-peak-usage.phpを参照してください。

于 2012-12-06T09:52:38.217 に答える