我正在使用具有 ActiveRecord 系统的 PHP 框架。我很快就遇到了 ActiveRecord 的问题,它使用大量内存并且对于具有大量结果的复杂查询执行时间很长。
对于我的参考页面(生成包含 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 消耗?