2012-08-10 34 views
2

我正在使用具有ActiveRecord系統的PHP框架。我使用大量內存迅速遇到了ActiveRecord的麻煩,並且對於結果很大的複雜查詢執行時間很長。執行時間和內存使用情況是PHP的唯一相關性能指標嗎? CPU呢?

對於我的參考頁(腳本生成與10,000個對象的陣列)我有管理以減少內存消耗從100+ MB至〜15 MB,和從5+秒至〜1.5秒減少執行時間。

是這兩個測量要考慮的唯一的,或者我應該通過PHP看其他指標提供給我?

我已經通過改變存儲的東西在對象變量函數來計算它在飛行中實現了大部分的改進。因此,我擔心CPU,因爲在我的本地主機上測試沒有CPU短缺......然而,在現場環境中,由於其他請求等,CPU一直在使用。但是如何在PHP中測量CPU消耗?

示例:每當一個有效記錄的被實例化,字段,規則和關係在專用屬性分別設置內每個對象實例。我改變了這個功能,總是編譯和返回值,而不是使用對象屬性。

讓記憶做到這一點:

class Record { 
    private $relations; 
    private $fields; 
    function __construct() { 
    $this->setRelations(); 
    $this->setFields(); 
    } 
    private function setRelations() { 
    // This process of getting predefined relations, checking for correct data, 
    // and some other calculations is done once, on every construct. 
    // The result is stored in $this->relations; 
    // This costs memory! 
    } 
    private function setFields() { 
    // This process of getting predefined fields, checking for correct data, 
    // and some other calculations is done once, on every construct. 
    // The result is stored in $this->fields; 
    // This costs memory! 
    } 
    private function getRelations() { 
    // This is fast. Loading the set relations from memory. 
    return $this->relations; 
    } 
    private function getFields() { 
    // This is fast. Loading the set relations from memory. 
    return $this->fields; 
    } 
} 

讓CPU做:

class Record { 
    function __construct() { 
    // Drop the setter methods. Let the CPU work when using the getters. 
    } 
    private function getRelations() { 
    // This process of getting predefined relations, checking for correct data, 
    // and some other calculations is done once, on every getFields() 
    // This costs CPU! 
    return $relations; 
    } 
    private function getFields() { 
    // This process of getting predefined fields, checking for correct data, 
    // and some other calculations is done once, on every getFields() 
    // This costs CPU! 
    return $fields; 
    } 
} 

我的兩個主要問題是:

  1. 什麼是更好的?
  2. 如何測量CPU消耗量?
+0

呃,如果你關心性能,ActiveRecord ORM是你應該使用的最後一件事情。這對於快速原型設計來說很不錯,但這是一個巨大的性能折衷,而且在高負載應用中通常是一個錯誤。我建議看看網關和DataMapper。 – rdlowrey 2012-08-10 20:20:50

回答

1

您忘記了一個非常重要的因素:您的數據庫。確保它的索引正確。執行查詢分析以查看最壞情況下檢查了多少行。 9倍於10它是數據庫,而不是利用它的代碼導致性能問題。

1

你可能測量的執行時間爲掛鐘時間將由其他事物的CPU在做什麼,無論您的程序區塊受到影響。例如,當您進行數據庫調用時,掛鐘會在CPU空閒時繼續運行。這個空閒時間可以用來處理其他請求,即使它看起來像你很忙。

使用分析器,如XHProf測量精確的內存,CPU和整個應用程序掛鐘成本。它測量每個功能所花費的時間和內存消耗,並且不包括他們所調用的其他功能,允許您深入到應用程序中。

至於哪個更重要 - 時間或記憶 - 取決於整個應用程序配置文件。如果你有很多需要大量內存的請求,你會想要定製新的請求來使用更多的CPU。相反的情況也適用。此外,在嘗試同時處理更多請求時,在短時間內佔用大量內存很重要。

相關問題