1

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

$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();
4

2 回答 2

1

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

tl;博士

取决于底层的getDoctrine()工作方式,第二种方法至少会在执行中增加一些方法调用开销。

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

在内存占用和性能开销之间总是存在权衡。

编辑

更糟糕的情况:后者每次调用 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 回答