Symfony2:在函数中查找对象 vs 将对象传递给函数
Symfony2: Find object in function vs pass object to function
我在 Symfony2 中有一个修改对象的函数。该函数可以通过两种方式之一接收对象。首先,可以像这样将对象传递给函数:
public function myFunction(Object $myObject)
{
// Do something with $myObject
}
或者,可以将对象 ID(或任何其他属性)传递给函数并用于在函数内查找对象,如下所示:
public function myFunction($id)
{
$myObject = $this->entityManager->getRepository('AppBundle\Entity\Object')->find($id);
// Do something with $myObject
}
在功能上,这两种方法是等效的。我的问题是,这两种方法对应用程序性能的影响有何不同?我知道为了优化性能应该尽量减少数据库查询的数量。那么,额外 find()
的性能成本如何?
查询与将对象传递给函数的性能成本比较?
将对象传递给函数总是会提高性能。由于 PHP5 个对象 are passed by object identifier, very similar in concept to pass by reference.
也就是说,从数据库中检索单个记录的原始数据是比较快的。根据我的经验,水合作用(将从数据库中检索到的关系数据转换为其映射的业务对象)是您发现瓶颈的地方。 Doctrine 的首席开发人员 Marco Pivetta 撰写了一篇 excellent post about this.
一般来说,在正常情况下,您可能会注意到传递一个对象和水化单个对象在性能上没有区别。然而,在循环中补水是您 运行 遇到麻烦的地方。对象越复杂,混合的数据越多,性能就越差。
我在 Symfony2 中有一个修改对象的函数。该函数可以通过两种方式之一接收对象。首先,可以像这样将对象传递给函数:
public function myFunction(Object $myObject)
{
// Do something with $myObject
}
或者,可以将对象 ID(或任何其他属性)传递给函数并用于在函数内查找对象,如下所示:
public function myFunction($id)
{
$myObject = $this->entityManager->getRepository('AppBundle\Entity\Object')->find($id);
// Do something with $myObject
}
在功能上,这两种方法是等效的。我的问题是,这两种方法对应用程序性能的影响有何不同?我知道为了优化性能应该尽量减少数据库查询的数量。那么,额外 find()
的性能成本如何?
查询与将对象传递给函数的性能成本比较?
将对象传递给函数总是会提高性能。由于 PHP5 个对象 are passed by object identifier, very similar in concept to pass by reference.
也就是说,从数据库中检索单个记录的原始数据是比较快的。根据我的经验,水合作用(将从数据库中检索到的关系数据转换为其映射的业务对象)是您发现瓶颈的地方。 Doctrine 的首席开发人员 Marco Pivetta 撰写了一篇 excellent post about this.
一般来说,在正常情况下,您可能会注意到传递一个对象和水化单个对象在性能上没有区别。然而,在循环中补水是您 运行 遇到麻烦的地方。对象越复杂,混合的数据越多,性能就越差。