2012-12-06 48 views
1

我有以下兩個代碼。哪些代碼在性能方面很好?PHP腳本的內存使用和執行速度

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

我沒有任何指標你,但我個人的代碼看起來像第一個。閱讀更好,更容易改變。 –

+3

真的沒有辦法說這不僅僅是一個受過教育的猜測。你將不得不使用諸如xdebug中的分析器之類的工具或諸如memory_get_usage()之類的函數來獲取一些硬數據。然而,在實踐中,差異可能不會很大,使用性能優先於其他方式通常會歸結爲[標籤:微型優化]。您應該先編寫代碼以保持正確和可維護性,然後擔心性能問題。 – GordonM

+0

@GordonM感謝您的寶貴意見。 –

回答

1

簡短回答:前者大多數情況下會更快,但會吃掉更多的記憶。

TL;博士

取決於如何底層getDoctrine()作品,第二種方法將至少在執行加一些方法呼開銷。

如果這些方法進行計算並且沒有任何緩存機制,那麼您還必須爲此查找整個調用堆棧。

內存佔用與性能開銷之間總是存在折衷。

編輯

最壞的情況:後者將創建某種潛在的數據,你可以調用一個getter每一次的實例。這對性能沒有幫助,甚至造成堆峯值。

最好的情況:對getters的所有子序列調用都訪問相同的對象,這在DAO或SQL helper中實際上相當罕見,因爲父對象內部存在引用,所以會消耗與第一個對象完全相同的內存目的。

我的建議在這種情況下,使用第一個。

+0

「PHP在寫入機制上使用副本」。所以它不會爲「$ gd和$ em」使用多少內存,對吧?在第二種情況下,即使引用來自函數,該函數也會增加執行時間,對吧? –

+0

我還沒有研究symfony的事情,我能做的最好的是有點'通用'的答案。第一種說法在數組上是真實的,對象實例化取決於對象是如何定義的。在第二種說法中,你是對的,試着用數千個函數來包裝1 + 1,你很可能會看到一些基準測試。 – Vicary

+0

我不是這是symfony特定的。這些方法只是返回一個引用。這就是全部(我認爲) –