速度比较 - 解释型语言中的过程式编程 vs. 面向对象编程

22

在解释性编程语言,如PHP和JavaScript中,采用面向对象方法与过程式方法相比有什么影响?

具体来说,当创建Web应用并在过程式方法和面向对象方法之间选择时,我要考虑的是一份清单,以优化速度和可维护性。如果您知道任何探讨此问题的文章,引用的研究和测试案例也将有所帮助。

归根结底: 在解释性语言中,采用面向对象方法与过程式方法相比,性能损失有多大(如果有的话)?

7个回答

17

也许我有点疯狂,但在像这样使用解释性语言的情况下担心速度,就像尝试弄清楚要把小屋子涂成什么颜色一样。更不用说这种优化完全是过早的想法了。

当你提到“可维护性”时,你说得一针见血。我会选择最具生产力和可维护性的方法。如果你需要速度,那么从在解释性语言中切换过程式编程与面向对象编程范式是得不到速度的。


我曾经有过一个上司,简直是个地狱级别的存在。他对编程一窍不通,却自以为是(有一次他跟我讲关于 Unix 时间戳的事情,告诉我:“Unix 时间戳就像欧洲人的时间戳一样,很奇怪,他们把日子放在前面然后才是月份,就像这样:dd/mm/yyyy” 哄堂大笑,真是个白痴)。所以当他知道我在做面向对象的 PHP 时,就发飙说这会“拖慢我们的网站速度”。我试图寻找任何一种能够证明他错的研究,这样我就可以继续使用面向对象编程... - cmcculloh
面向对象编程(OOP)是一种生产效率较低且难以维护的编程方式。 - Pablo Ariel
@cmcculloh 在欧洲,日期格式是日/月/年,从最小到最大;而在中国,日期格式是年/月/日,从最大到最小。显然,这些是逻辑上唯一有意义的方式。 - Hasen
嗯,有趣的比喻,但我不理解。选择棚屋的颜色可能很容易,但它并不影响棚屋的整体设计。在过程式和面向对象的编程风格之间切换是复杂的,几乎需要完全重写代码。 - ericcurtin

10

不幸的是,我也做了我的测试。我测试了速度,它大致相同,但是当使用PHP中的memory_get_usage()测试内存使用情况时,在面向对象编程(OOP)方面看到了一个非常高的数字。

OOP需要116,576字节,而过程式编程只需要18,856字节。我知道“硬件很便宜”,但是这个使用量增加了1000%?对不起,这并不是最优的。而且一旦有很多用户同时访问您的网站,我确信您的RAM会过热或者用完。我错了吗?


4
结论是不行的,因为解释的开销超过了方法分派的开销。

2
根据我的经验,当网站承载压力较大时,面向对象(OOP)的代码比过程化代码更容易变得笨重和无响应。原因很容易理解。
OOP需要更多内存分配(MALLOC)和更多的操作才能在内存中运行,比过程化代码更需要CPU时间来执行任务。它本质上是“开销”,包裹在过程式代码周围,在执行它时增加了CPU的负担,特别是在执行数据库操作时。
许多程序员喜欢OOP的方便性,创建简单接口后隐藏在小黑盒子中。然而,我曾被高薪聘请来修复在重负荷下响应时间过长的网站。剥离OOP并用简单的过程式函数替换它可以产生巨大的影响。
如果您不指望网站非常繁忙,请放心使用OOP。如果您正在构建一个高流量系统,则希望尽可能地削减处理中的每个CPU周期和每个输出字节。

2
你的表现将由实现方式决定,而非编程语言。只要你设计它具有可伸缩性,即使使用最慢的语言,它也可以成为世界上最大的网站。
只需记住优化的第一个规则。
不要优化。
:)

1
如果您正在使用解释性语言,则差异无关紧要。如果性能是一个问题,您不应该使用解释性语言。两者的性能大致相同。

0

实际上,我在维护的一个网站上使用Python进行了类似的小测试,并发现它们的速度几乎相当,过程式方法略胜一筹,但面向对象的代码显然更加简洁明了,以至于我只执行了一次迭代就停止练习。

所以,在我的经验中,这并不重要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接