我正在使用具有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;
}
}
我的兩個主要問題是:
- 什麼是更好的?
- 如何測量CPU消耗量?
呃,如果你關心性能,ActiveRecord ORM是你應該使用的最後一件事情。這對於快速原型設計來說很不錯,但這是一個巨大的性能折衷,而且在高負載應用中通常是一個錯誤。我建議看看網關和DataMapper。 – rdlowrey 2012-08-10 20:20:50