PHP脚本的内存使用和执行速度

PHP脚本的内存使用和执行速度,php,performance,symfony,Php,Performance,Symfony,我有以下两个代码。哪种代码在性能方面是好的 $gd = $this->getDoctrine(); $em = $gd->getEntityManager(); $data = $gd->getRepository('MyB:MyC')->find...; // update $data. $em->persist($data); $em->flush(); 我想知道它的内存使用情况和执行速度 $data = $this->getDoctrine()-

我有以下两个代码。哪种代码在性能方面是好的

$gd = $this->getDoctrine();
$em = $gd->getEntityManager();
$data = $gd->getRepository('MyB:MyC')->find...;
// update $data.
$em->persist($data);
$em->flush();
我想知道它的内存使用情况和执行速度

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

简短回答:在大多数情况下,前者会更快,但会消耗更多内存

tl;博士

根据底层的
getDoctrine()
的工作方式,第二个方法至少会在执行中添加一些方法调用开销

如果这些方法进行计算,并且没有任何缓存机制,那么您还必须为此跟踪整个调用堆栈

内存占用和性能开销之间总是有一个折衷

编辑

更糟糕的情况是:后者会在每次调用getter时创建某种底层数据的实例。这无助于提高性能,甚至会造成堆峰值

最佳情况:对getter的所有子序列调用都在访问同一个对象,这在DAO或SQL帮助程序中是非常罕见的,因为父对象中保留了一个引用,所以会消耗与第一个完全相同的内存


在这种情况下,我的建议是使用第一个。

你可以很容易地找到答案

memory_get_peak_usage ()

请参见

我没有为您提供任何指标,但就我个人而言,我的代码看起来像第一个。阅读更好,更容易改变。没有比一个有根据的猜测更能说明这一点的了。您必须使用诸如xdebug中的profiler之类的工具或诸如memory\u get\u usage()之类的函数来获取一些硬数据。然而,在实践中,这种差异可能并不显著,使用性能来支持其中一个,而不是另一个,通常可以归结为一个问题。您应该先编写正确且可维护的代码,然后在性能问题明显时再考虑它。@GordonM感谢您的宝贵建议。“PHP使用一种写时拷贝机制”。所以“$gd和$em”不会占用太多内存,对吗?在第二种情况下,即使引用来自函数,函数也会增加执行时间,对吗?我还没有研究symfony的东西,我能做的最好的是一种“通用”答案。第一条语句在数组上为true,对象实例化取决于对象的定义方式。在第二条语句中你是对的,尝试将1+1包装成数千个函数,你可能会在基准测试中看到一些东西。我不认为它是特定于symfony的。这些方法只是返回一个引用。这(我认为)并非完全正确。一些DAO实现在每个查询上创建一个新对象,因为它们遵循“数据对象是不可变的”规则。