2009-10-30 78 views
18

我曾经使用过程式PHP。后来,我用来创建一些类。后来,我学习了Zend Framework,并开始以OOP风格进行编程。现在我的程序基于我自己的框架(包含cms元素,但没有任何框架中),它构建在Zend Framework的顶层。面向对象的PHP很慢吗?

现在它由很多类组成。但是我的计划越多,恐怕就越多。恐怕我的程序会因为他们而变慢,我害怕每增加一个类别都可以帮助我开发,但会减慢应用程序的速度。

我所知道的是,包含大量文件会降低应用程序的速度(使用eAccelerator +收集一个文件中的所有代码可以加速应用程序20次!),但我不知道创建新的类和对象是否会减慢PHP本身。

有没有人有关于它的任何信息?

+3

如果你的程序是越来越慢,你可能会重新考虑你的类结构,那么应该如何实现你的目标。我从来没有听说过OOP比程序风格慢。 – backslash17 2009-10-30 19:15:22

+0

感谢您的编辑,托马斯!有一件事:我认为,新标题有点不同。虽然,我的英语不好,我不会回滚,只是评论:) – 2009-10-30 19:15:58

+0

@ backslash17我不认为我的程序很慢。但是如果再有10节课会让它慢下来,恐怕我很害怕。另外50?另外100个? – 2009-10-30 19:17:52

回答

16

这里的good article discussing the issue.我也看到了一些anecdotal bench-marks,将放在OOP PHP开销在10-15% 我个人认为OOP是更好的选择,因为在最后,可能有更好的表现,只是因为它可能是更好的设计和经过深思熟虑。程序代码往往是混乱的,难以维护。所以最终 - 你的应用程序的性能差异与维护,扩展和简单理解的能力有多关键。

+0

谢谢! (顺便说一下,脚本B在轶事的基准测试工作中吗?我认为,应该通过引用来传递$篮子。或者我太C-lish?:) – 2009-10-30 19:36:03

+0

Imho,从不选择一个或另一个盲目的眼睛。 如果脚本很小,并且需要完整的性能,请使用程序,尽量写出较少的意大利面。 如果脚本(不是项目,我的意思是脚本..大项目有许多小脚本,一些在OOP,一些在程序),你需要完全的可维护性,与oop一起去。 – Strae 2009-11-05 15:48:42

+0

我同意,并且我在最后做出了同样的观点 – Bostone 2009-11-05 16:33:15

2

是的,每个include都会让你的程序变慢,但是除此之外还有更多。

如果你分解你的程序,通过很多文件,有一点你包括/解析/执行最少量的代码,包括所有这些文件的开销。另外,拥有大量文件的代码很少,并不是那么糟糕,因为正如你所说,使用诸如eAccelerator或APC之类的东西,是一种让人不可思议的性能回报的微不足道的方法。同时,如果你相信他们,你会得到拥有和面向对象代码库的所有优点。

此外,每个请求的基础上减慢!=不可扩展。

更新

按照要求,PHP仍然较快,在直线上升数组操作比它的类。我隐约记得ORM项目的学说,还有人比较了数组和对象的水合作用,并且阵列出来的速度更快。这不是一个数量级,但它是显而易见的,但是 - this is in french, but the code and results are completely understandable.。请注意,该教义使用魔法方法__get和__set很多,而且这些方法也比明确的变量访问慢,原则的一部分对象水合缓慢可能归因于此,所以我会将其视为最糟糕的情况。最后,即使你使用的是数组,如果你不得不在内存中进行大量的移动,或者像isset这样的测试,或者像'in_array'这样的函数(它的顺序为N),那么你会使性能好处。还要记住,对象只是下面的数组,解释器只是将它们视为一个特殊对象。个人而言,我会更喜欢更好的代码,而不是性能提高的一小部分,您会从更聪明的算法中获益更多。

+0

哦,谢谢你的最后一行!它杀了很多我的疑惑:)其他线路呢,如我所说,我知道包括和询问有关自己的课程:) – 2009-10-30 19:29:29

0

如果您使用的是include_once(),那么无论OOP设计与否,您都会导致不必要的减速。

OOP会给你的代码增加开销,但我敢打赌你永远不会注意到它。

+0

哦,谢谢,我想我应该记住它。顺便说一句,我不经常使用包含。我更喜欢自动加载文件,然后在一个文件中测试并收集大部分文件,然后上传到生产 – 2009-10-30 19:42:42

+0

我发现特别是自动加载是最大的减速。对于目录查找和文件开放访问,PHP速度非常慢,在自定义自动加载器中使用的PHP函数越多,速度越慢。你可以通过关闭安全模式(反正不推荐使用)或者甚至open-basedir(但我不这么做)来帮助它,但是最大的改进来自于不使用自动加载,并且简单地在完整的fs中使用“require_once”修改要求您使用的每个php文件的所有依赖关系。 – hurikhan77 2012-11-12 07:00:44

0

你可能会重新考虑重新考虑你的类结构以及如何实现它们。如果您说OOP较慢,您可能需要重新设计您的课程,并且您如何实施它们。一个类只是一个对象的模板,任何不好的设计方法都会影响该类的所有对象。

尽你所能地使用继承和polimorfism,这将有效地减少您的类需要的行为和独立方法的数量,但首先您需要创建一个良好的继承图,将您的第一个或母类抽象为您可以。

问题是你有多少类,问题是它们有多少种方法,属性或字段,以及这些方法结构如何。继承减少了大量的设计方法和编译代码的数量。

+0

我没有说过'OOP慢'。我问过,如果是。 – 2009-10-30 19:39:20

0

使用大型框架的网络应用程序,实际上并不需要如此庞大的类数量的一切可能是许多人都不知道的最糟糕的问题。剥离它至少不包括每一个代码,保持你所需要的,然后扔掉其余的东西。

12

最重要的是要记住的是,先设计,后期优化。更好的设计,更可维护,比面条代码更好。否则,你不妨在汇编程序中编写你的web应用程序。完成后,您可以进行配置文件(而不是猜测),并优化最慢的部分。

+0

profiling php是一件令人头疼的事情(用于阅读XDebug的文件,我必须使用Linux,或者使用奇怪的Air应用程序,它不会显示任何信息,只能将文件转换为其他奇数格式,或者我可以使用Zend Debugger,但我真的不想购买Zend Studio) – 2009-10-30 19:46:00

+0

+1为真 – 2009-10-30 19:54:11

+2

Wincachegrind一直很适合我在windows下阅读profiler输出。 – 2009-10-30 23:49:17

0

正如其他几位人士指出的那样,OO PHP有一个轻微的开销,但您可以通过将优化工作集中在您的各种其他类从中获得的核心类上来抵消它。这就是为什么C++在高性能计算领域变得越来越流行,传统上C和Fortran是领域。

就我个人而言,我从来没有见过受CPU限制的PHP服务器。检查你的RAM使用情况(你也可以优化核心类),并确保你没有进行不必要的数据库调用,这比你正在做的任何额外的CPU工作要贵得多。

1

如果您的项目包含许多文件,并且由于PHP的文件访问检查和限制的性质,我建议打开realpath_cache,将配置设置提高到合理的数字,并关闭open_basedirsafe_mode。确保使用PHP-FPM或SuExec在受限于文档根目录的用户标识下运行php进程,以获取通常从open_basedir和/或safe_mode获得的安全性。

这里有几个三分球为什么这是一个性能增益:

还要考虑我的答案评论来自@奥拉维尔:

我发现特别是自动加载是最大的减速。对于目录查找和文件开放访问,PHP速度非常慢,在自定义自动加载器中使用的PHP函数越多,速度越慢。你可以通过关闭安全模式(反正不推荐使用)或者甚至open-basedir(但我不这么做)来帮助它,但是最大的改进来自于不使用自动加载,并且简单地在完整的fs中使用“require_once”修改要求您使用的每个php文件的所有依赖关系。

+0

+1的信息,虽然不是主要问题的答案;) – 2012-12-24 17:51:30

36

这个错误我。请参阅...程序代码并不总是意大利面代码,但OOP粉丝总是假定它是。我已经编写了几个基于程序的Web应用程序以及PHP中的IRC服务守护程序。令人惊讶的是,它似乎超过了大多数其他的那些,编辑它是非常容易的。我的一个朋友谁一般不会OOP看了看,并说:“没有任何代码必须是这种清洁的权利”

一个好的程序员没有开销类可以带来巨大的编写程序代码。一个糟糕的程序员总是会编写糟糕的OOP代码来减慢速度。

没有一个正确的答案这是PHP

+7

+1绝对真实! – ygaradon 2013-05-13 08:40:08

+0

的确如此。代码的雅观完全取决于写它的人,而不是它是面向对象或功能的事实。 – 2014-03-14 17:09:59

+12

@Jeremy我希望看到你提到的这个非常干净的程序代码的链接。即“图片或它没有发生”。 :) – Stephen 2014-04-09 19:10:23

0

更好,如果你设计了一个巨大的OOP对象生猪,即做的一切,而不是做功能分解到各个阶级,你会明显充满了无用的记忆镇流器代码。另外,如果框架很慢,你不会快速地做出一个简单的hello World。我注意到这是一种趋势(坏习惯),对于一个单一的Facebook图标,人们包括一个洞真棒字体库,然后接下来是一个包含fontello的搜索图标。每次他们完成一些不寻常的事情时,他们连接整个框架。如果你想创建一个快速加载的应用程序使用一个框架只有zephir-phalcon或任何你想象和坚持它。

-1

有办法限制从include_once项处罚,这是由具有在“include_once”文件中声明函数本身具有在“包括”陈述他们的代码内容。这会加载你的代码库,但只有实际使用的那些函数会根据需要加载代码。您为包含的代码获取第二个文件系统命中,但内存使用情况对于库本身而言几乎没有任何影响,只有您的程序使用的代码被加载。来自第二个文件系统访问的命中可以通过缓存来缓解。在处理基于程序的PHP的大型项目时,这提供了低内存使用和快速处理。不要在课堂上这样做。这将用于生产实例,因为您不希望缓存打开,所以开发服务器将显示所有点击的惩罚。