6

我正在使用 Zend Framework 1.11、Doctrine 2、一些 Symfony 2 组件和其他工具和库来开发一个项目。

我正在尝试使用 Xdebug & Webgrind 优化性能。

我已经发现了一些瓶颈,比如解析 Ini 配置等。并将其缓存起来。

现在,我才意识到自动加载是我的应用程序中最昂贵的部分:

    Opl\Autoloader\ApcLoader->loadClass                    274   31.36   43.86
    Zend_Loader_PluginLoader->load                         150    4.80   12.29
    Zend_Loader_Autoloader->getClassAutoloaders            278    1.42    1.91
    Zend_Controller_Router_Route_Regex->_getMappedValues   291    1.29    1.35
    Doctrine\ORM\UnitOfWork->createEntity                   85    1.24    3.18

正如您所看到的,我没有使用默认值Zend_Loader_Autoloader,我正在使用Opl它,据我所知,它比它更快,我正在使用classMapLoaderAPC 缓存,但与应用程序的其余部分相比它仍然有点慢。

我该如何优化呢?

我已经加载了大约 250 个类,看起来只有 ~40 个很慢,其他显示 0,00 为“总调用成本”,但其他在 require 调用中从 0,08 增加到 0,57。

顺便说一句,由于使用了 Opl 自动加载器,看起来在我的生产环境 APC 上只有操作码缓存“手动需要”的文件,而不是自动加载器调用的文件。

4

4 回答 4

4

如果重构代码不是一种选择(放弃 Zend Framework、Drop Doctrine、Drop ...),我会首先优化购买更好的硬件。这将自动优化您的代码,因为代码的上下文只是移动了(这并不是完全优化代码,因为代码不会改变)。

如果这不是一个选项,请考虑为自己创建一个构建系统,该系统可以预处理您的代码库并创建它的非开发版本以减少加载过程。这需要分析始终需要哪些文件,并将它们全部编译成加载器优化格式,可以是单个文件和/或静态类加载器映射。

然而,众所周知,Zend 总是需要将大量内容加载到内存中。即使使用像 APC 这样的 PHP 缓存也可能已经为您带来了一些东西(考虑使用前面提到的构建脚本进行预编译并优化您的指标突出显示的部分)。

如果您的应用程序结构允许,还有另一种可能性:在请求之间将整个应用程序保留在内存中。这可以通过 PHP 网络服务器来完成。完成后,代码只需要在服务器启动后加载,并且永远不需要再次加载。如果它支持多个请求,这仅适用于您自己的应用程序。一个很好的封装应用程序,特别是带有请求逻辑的应用程序可以很容易地被采用。现有的解决方案是appserver-in-php。与您已经从 APC 获得的好处相比,您会惊讶于速度的提高。

也许这很有帮助。很难提出任何其他更具体的建议,因为无法看到您的代码正在运行,也无法获得详细的指标。你刚刚传递了一个关于幕后发生的事情的片段,所以很难更具体地告诉你。

于 2011-12-19T11:21:51.143 回答
3

我正在尝试使用 Xdebug 和 Webgrind 优化性能

好的,既然你正处于一个非常需要更好性能的位置,你可能会接受一种不太受欢迎但明显有效的方法来做到这一点。

它适用于任何语言,只要有一个可以暂停的调试器,比如 Xdebug。

这里简单介绍一下。 这是其有效性的一个证明。 我可以给你更多链接。

你可能会发现它有点智力上的痛苦。如在

  1. 您发现“瓶颈”是与例行程序相关的时间。最有价值的加速机会通常不会以这种方式表现出来。它们是您在看到它们时可以轻松描述的活动,但它们是分散的。它们不会将大量时间集中在任何特定的例程或代码行中,因此分析器看不到它们。

  2. 最大的加速机会可能根本不容易解决。他们可能需要重新考虑计划的组织方式。如果您找到可以轻松解决的问题,那就太好了。继续做吧。如果它不是那么容易修复,但仍然会节省很多时间,如果你需要节省时间,那么你必须这样做,不管喜欢与否。

祝你好运。

于 2011-12-19T16:33:18.027 回答
1

我不喜欢 hakre 的建议。首先,我会看看是否可以删除 Web 服务器。如果是这样,一个不错的选择是 nginx 或 lighttpd。与本世纪的 Apache 相比,它们的配置也容易得多。关于自动加载我真的不知道,但是如果类文件真的很大,您是否尝试安装 ram 磁盘或使用 php 压缩器?根据我的经验,PHP 压缩器可以显着加快执行时间(即解析时间)。

于 2011-12-19T13:04:54.917 回答
0

我没有太多经验,但是一旦遇到这样的问题。我检查了我的包含路径并按照最大使用库路径的顺序对它们进行了排序。我得到了将近 30% 的提升。我想你已经知道了,但已经发布了任何方式....... :)

于 2012-07-07T14:28:45.173 回答