2

我正在使用具有 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;
  }
}

我的两个主要问题是:

  1. 什么是更好的?
  2. 如何测量 CPU 消耗?
4

2 回答 2

1

您在这里忘记了一个非常重要的因素:您的数据库。确保它已正确编入索引。执行查询分析以查看在最坏情况下检查了多少行。10 次中有 9 次是数据库而不是利用它的代码导致性能问题。

于 2012-08-10T20:17:41.653 回答
1

您可能将执行时间测量为挂钟时间,这将受到 CPU 正在执行的其他事情以及您的进程是否阻塞的影响。例如,当您进行数据库调用时,挂钟会在 CPU 空闲时继续运行。这个空闲时间可以用来处理其他请求,即使它看起来很忙。

使用XHProf等分析器来测量整个应用程序中的精确内存、CPU 和挂钟成本。它测量每个函数所花费的时间和消耗的内存,包括和不包括它们调用的其他函数,允许您深入了解您的应用程序。

至于哪个更重要 - 时间或内存 - 这取决于整个应用程序配置文件。如果您有大量占用大量内存的请求,您将需要定制新请求以使用更多 CPU。反过来也一样。此外,当您尝试同时处理更多请求时,在短时间内占用大量内存更重要。

于 2012-08-10T20:19:41.050 回答