パフォーマンスが非常に重要なサイトのフロント エンドを開発しています。迅速な開発も重要だったので、symfony2 を採用し、Doctrine2 ORM を使用することにしました。
symfony から (DB リクエストなしで) シンプルなページをリクエストすると、~200ms で応答します。Doctrine を介して DB に何かを要求するとすぐに、最大 1300 ミリ秒に跳ね上がります。
レコードをハイドレートする時間があることを感謝しますが、これは私がアレイにハイドレートすることです。
コントローラーコードはこちら。テンプレートは配列カウントを出力するだけです。
$repository = $this->getDoctrine()->getManager()->getRepository('AcmeProductBundle:Product');
$qb = $repository->createQueryBuilder('g');
$qb->addOrderBy('g.id', 'DESC');
$ret = null;
$query = $qb->getQuery();
//$query->useResultCache(true, 3600);
$ret = $query->getArrayResult();
return $this->render('AcmeCatalogBundle::test.html.twig', array('id' => count($ret)));
symfony プロファイラー ツールバーのティムラインを見ると、コントローラーは約 1000 ミリ秒、doctrine は約 1 ミリ秒かかっています。しかし、getResults() 行をコメントアウトすると、コントローラーは 45ms までジャンプします。
これは正常ですか?これについて何ができますか?
更新 次のテストを実行したところ、最初のクエリですべての時間が失われていることがわかりました。
$ret = array();
$start = microtime(true);
for ($i = 1; $i <= 10; $i++) {
$time_start = microtime(true);
$query = $em->createQuery('SELECT p FROM AcmeProductBundle:Product p WHERE p.id = 1');
$products = $query->getResult();
$time_end = microtime(true);
$ret[$i] = $time_end - $time_start;
}
$end = microtime(true);
$ret['Total'] = $end - $start;
return $this->render('AcmeCatalogBundle::test.html.twig', array('ret' => $ret));
そして結果:
- 1.0216779708862
- 0.00091791152954102
- 0.00082588195800781
- 0.00081419944763184
- 0.00081706047058105
- 0.00081610679626465
- 0.00081491470336914
- 0.00081706047058105
- 0.00043296813964844
- 0.0004270076751709
合計 - 1.0283808708191
おそらく、データベース接続またはエンティティマネージャーがプールされていない可能性がありますか?