我正在为性能非常重要的网站开发前端。快速开发也是关键,所以我决定使用 symfony2 并使用 Doctrine2 ORM。
当我从 symfony 请求一个简单页面(没有 DB 请求)时,它会在 200 毫秒内响应。一旦我通过 Doctrine 从数据库请求任何东西,它就会跳到 ~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 profiler 工具栏中的 Timline,控制器耗时约 1000 毫秒,而学说耗时约 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
可能是数据库连接或实体管理器没有被池化吗?