2011-12-19 23 views
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这是看到的,因为据我所知,比它快,我使用带有APC缓存的classMapLoader,但与其他应用程序相比,它仍然有点慢。

我该如何优化?

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

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

回答

4

如果重构你的代码不是一个选项(drop Zend Framework,Drop Doctrine,Drop ...),我会首先优化购买更好的硬件。这会自动优化你的代码,因为代码的上下文刚刚移动(这不是完全优化代码,因为代码不会改变)。

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

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

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

也许这是有帮助的。任何额外的,更具体的建议都很难做到,因为无法看到您的代码正在运行,也没有详细的指标。你刚刚在幕后传递了一个片段,所以很难更具体地告诉你。

+0

谢谢你的伟大答案,事实上,我的问题是我从ZF1.7和Zend_Db及其交易从旧式应用程序迁移费率(由围攻给出)返回类似30/40/s的地方只有10,但我做了很多优化,如查询优化,可以减少全球请求时间,但我有点失望,有这样的速度。当然,购买新硬件是一种解决方案,它会是,但我不希望它成为解决方案。在看自动加载器时,看起来Doctrine需要比Zend Framework本身更多的文件。 – Trent 2011-12-19 13:10:13

+0

考虑一下,如果你真的需要在你的应用程序中使用ORM。如果你不这样做,放弃原则,只使用* table data gateway *或* row data gateway * zend library offers。或者在PDO中使用PHP本地mysql驱动程序来坚持自己的数据库抽象。如果数据库是您的瓶颈,请将您的代码和数据库放在一起以获得更短的路径。这可能会减少ORM提供的一些舒适选项,但是通过创建自己的函数来获取数据并将数据推送到mysql存储,您的速度会更快,并且可以编写您自己的舒适代码。 – hakre 2011-12-19 13:18:51

+1

我喜欢建议放弃各种东西(即减轻)。我不在乎“购买更好的硬件,这会自动优化你的代码”。这就好比说,如果赛马会太胖,会得到一匹更快的马。芯片供应商的勤奋工程师为我们提供更快的硬件而做出了惊人的工作。我想知道他们是否知道程序员是依赖于这个的,而不是让他们的代码脱离胖子? – 2011-12-19 14:20:05

1

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

3

我尝试使用Xdebug的&以优化性能Webgrind

OK,既然你在认真地需要性能更好的位置的时候,你可能会开到比人气较少,但demonstrably有效的方法来做到这一点。

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

这里描述了in a nutshellHere's one demonstration of its effectiveness. 我可以链接你更多。

你可能会发现它有点智力上扭伤。如在

  1. 您正在发现与例程相关的“瓶颈”时间。最有价值的加速机会通常不会以这种方式表现出来。它们是你可以在看到它们时容易描述的活动,但它们是弥漫的。他们不会将重要时间集中在任何特定的程序或代码行中,因此分析人员不会看到它们。

  2. 最大的加速机会可能并不容易解决。他们可能需要重新考虑该计划的组织方式。如果你发现了一些你可以轻易修复的东西,那太棒了。继续做吧。如果它不是那么容易修复的,但仍然可以节省大量时间,如果您需要节省时间,那么您必须做到这一点,无论喜欢与否。

祝你好运。

0

我没有太多的经验,但一旦我有这样的问题。我已经检查了我的包含路径,并按照最大使用的库路径的顺序进行处理。而且我有近30%的提升。我认为它已经被你知道,但已张贴任何方式....... :)