严肃地说,我应该写糟糕的PHP代码吗?

18
最近我在进行一些PHP工作,在我看到的所有代码中,人们倾向于使用少量的方法。(他们也倾向于使用少量的变量,但这是另一个问题。)我想知道为什么会这样,并找到了这个注释:“具有一个参数和空函数体的函数调用大约需要与执行7-8 $localvar++操作相同的时间。类似的方法调用当然需要大约15个$localvar++操作”在这里
即使PHP页面已经编译并缓存,这是真的吗?我应该尽可能避免使用方法来提高效率吗?我喜欢编写组织良好、易读的代码,并在需要重复代码块的地方使用方法。如果必须编写没有方法的平面代码,是否有任何程序可以“内联”方法体?这样我就可以编写好的代码,然后再部署之前将其变得丑陋。
顺便说一下,我正在查看的代码来自Joomla 1.5核心和几个WordPress插件,所以我认为它们是知道自己在做什么的人。
注意:我很高兴大家都踊跃回答这个问题,谈论优化总体而言,但事实上我们谈论的是解释性语言中的优化。至少要有一些暗示我们正在谈论PHP的迹象。

有没有使用PHP并不重要,如果没有某种度量标准,就无法确定你应该或不应该做什么。 - Andy Lester
8
实际上,在您的帖子末尾,您做出了错误的假设。一些最受欢迎的 PHP 项目的代码质量并不是很好。OSCommerce、WordPress 和 Drupal 是其中的几个例子。流行 ≠ 良好设计。 - Peter Bailey
4
任何存在于4至5年前的PHP应用都是用一种与今天的PHP截然不同的语言编写的。面向对象编程仅仅是一个承诺的暗示。 - dkretz
4
还要考虑心理影响:写出可能运行较慢但美观的代码,比写出可能运行更快但难看的代码来得让人感觉更好。对于人类的心理来说,感觉自己做的事情很棒非常重要。 - Ilari Kajaste
2
我会将Drupal从不太出色的代码中排除在外。面向对象并不是万能的:http://drupal.org/node/547518。 - ax.
16个回答

74

你需要多高的“效率”? 你有测量过吗? 过早地进行优化是万恶之源,没有测量的优化总是过早的。

还记得优化俱乐部的规则

  1. 优化俱乐部的第一条规则是,不要进行优化。
  2. 优化俱乐部的第二条规则是,不要在没有测量的情况下进行优化。
  3. 如果您的应用程序运行速度比底层传输协议快,则优化已经完成。
  4. 一次只更改一个因素。
  5. 没有市场营销人员,没有市场营销日程安排。
  6. 测试将持续进行,直到完成。
  7. 如果这是您在优化俱乐部的第一晚,您必须编写一个测试用例。

1
太棒了。已经加入书签了。 - Ryan
1
Andy,这可能是一个独立的问题,但是你如何衡量你的应用程序比传输协议运行更快呢?它仍然需要通过传输进行处理,对吧? - Dan Rosenstark
1
规则的前提是,如果你受到输入/输出限制,那么担心函数开销就没有意义。如果你花费一秒钟计算一个数据桶,并花费十秒将其通过网络传输到磁盘或其他地方,那么应该关注的是这十秒,而不是一秒钟的计算时间。 - Andy Lester
SomeAnalogy扩展FightClub是被禁止的。 - eyelidlessness
3
生活中充满了失望。 - Andy Lester

57

我认为Joomla和WordPress并不是PHP好代码的最佳例子,无意冒犯。我没有针对这些项目的开发人员个人问题,他们让人们能够拥有一个网站/博客很不错。我知道许多人将所有空闲时间都花在其中之一上,但代码质量相当差(无意冒犯)。

如果您不相信,请查看过去一年的安全公告;另外,如果您认为它们之一具有性能,那么它们的代码也没有优势。因此,它绝不是好的代码,但WordPress和Joomla在前端方面都非常出色-易于使用,人们可以创建网站并执行操作。

这就是它们如此成功的原因,人们不会基于代码质量选择它们,而是基于它们使他们能够实现的内容。

回答您的性能问题,如果您想要的功能(函数、类等)会使应用程序变慢,这是真的。所以,如果您的应用程序/脚本全部位于一个文件中,那就随便写“糟糕的PHP代码”吧。

一旦您扩展并开始复制代码,则应考虑编写可维护代码带来的速度权衡。:-)

在我看来,这种权衡相当小,因为有两个原因:

  1. CPU便宜
  2. 开发人员不便宜

当您需要在六个月后重新进入代码时,请考虑运行它所节省的那些纳秒是否仍会在您需要修复恶性错误(由于重复代码而达到三到四次)时增加。

您可以执行各种操作以使PHP运行更快。通常人们推荐使用缓存,例如APC。 APC真的很棒。它为您在后台运行各种优化,例如缓存PHP文件的字节码,并为您提供用户空间函数以保存数据。

比如说,如果你每次运行脚本都解析配置文件,磁盘I/O非常关键。使用简单的apc_store()apc_fetch(),你可以将解析后的配置文件存储在基于文件或基于内存(RAM)的缓存中,并从那里检索,直到缓存过期或被删除。

当然,APC并不是唯一的缓存方式。


这是我对这个问题所期望的答案,甚至更多!感谢分享。 - Dan Rosenstark
我在想,是不是只有我认为WordPress的代码真的很糟糕。 - Spencer Mark

21

9
在99%的情况下,您更应该关注代码的可理解性。编写易于测试、理解和维护的代码。

在那些真正需要关注性能的少数情况下,像PHP这样的脚本语言并不是最好的选择。毕竟,PHP中许多基础库函数都是用C语言编写的。


6
Facebook 使用 PHP,因此显然可以在 PHP 上运行对性能要求高的网站。不要散布恐惧、疑虑和不确定性(FUD)。 - ceejayoz
4
如果代码需要进行超级优化,解释性语言并不是最佳选择,这句话并非恶意散播。 - Rich Bradshaw
2
有哪些可能的应用程序在PHP中解决会有如此高的性能要求,以至于在PHP中太慢了呢?这绝对是FUD。 - eyelidlessness
2
@Guido:也许你应该考虑重新措辞第二句话或者干脆删掉它。我完全同意你的观点——编写易于理解、可测试和可维护的代码比担心性能更重要——但是直接攻击PHP会引起争议,这也是我来到这里的原因。也许可以这样说:“在极少数需要关注性能的情况下,像PHP这样的脚本语言并不是最佳选择。毕竟,PHP中许多基础库函数都是用C语言编写的,这是有原因的。” - Randolpho
2
抱歉,我不是有意冒犯。 - Guido
显示剩余3条评论

8

个人认为,虽然函数调用可能会有一些开销,但如果这意味着我只需编写一次代码(参数化),然后在85个地方使用它,那么我就大大领先了,因为我可以在一个地方修复它。

脚本语言往往会让人们觉得,在编码时只需要考虑“足够好”和“能够工作”这两个标准。


5

特别是对于像PHP这样的快速解释器,我认为从中获得的效率提升,不值得因可读性/可维护性的缺失而付出代价。

至于WordPress,我想说的是:我浏览过很多WordPress代码。请不要认为那些人知道什么是好的代码。


2
关于WordPress的质量,确实如此。 - Bruce Alderman
你有一个好的PHP代码示例吗?比如一个开源应用程序? - alex

4
回答你的第一个问题,是的,这是真的,对于编译后的操作码也是如此。在极端情况下,除了避免代码重复之外,你可以通过避免函数调用来让你的代码更快。
你应该做自己喜欢的事情,“我喜欢编写组织良好、易读的代码,并在代码块需要重复时使用方法。”
如果你要犯这种可怕的罪行,删除所有函数调用,请至少使用分析器,并仅将其应用于最重要的10%的代码。

3
微观优化导致宏观减速的一个例子:
如果你正在认真考虑手动内联函数,请考虑手动展开循环。
JMPs很昂贵,如果您可以通过展开循环并消除所有条件块来消除循环,您将消除仅仅在CPU缓存中寻找的所有浪费时间。
运行时变量增强也很慢,从数据库中提取东西也很慢,因此您应该将所有这些数据都内联到您的代码中。
实际上,仅仅为了执行代码和将内存复制到用户那里而加载解释器是非常浪费的。为什么我们不预先计算所有可能的页面,并将每个页面存储在内存中,以便只需进行内存复制?这肯定很快!
啊,现在我们之间有一个叫做互联网的缓慢东西,它阻碍了用户体验并限制了我们可以使用的内容量。我们如何预先计算页面,并将其全部归档并在用户本地机器上运行?那会非常快!
但是这将浪费大量的CPU周期,例如页面加载时间和浏览器内容渲染等。我们将跳过中间人,并将页面交付给他们以打印媒体!太聪明了!
我看着你的公司在你手工预计算和打印没有人想看的页面时崩溃。
这听起来可能很傻,但对于我们其他人来说,您提出的就是那么荒谬。
优化是好的,但要在某个合理的地方划线,以便您不必担心未来的人追踪您的代码并因其无法维护而失眠。
注意:是的,我使用gentoo。你怎么猜到的?

我刚刚意识到这个冗长复杂的答案实际上非常酷。事实是:优化与可读性之间的折衷点是一个人选择的任意截止点。 - Dan Rosenstark

2

当然,你不应该写糟糕的PHP代码。但是一旦你写了糟糕的代码,你可以总是以性能为借口 :-)


不错!有多种选择很好。 - Dan Rosenstark

2
这是过早优化。虽然说一个函数调用比增加一个本地整数变量的成本更高(几乎所有东西都比它更贵),但与数据库查询相比,函数调用的成本仍然非常低。
另请参见:
Wikipedia - 优化 - 何时进行优化
c2.com Wiki - 过早优化

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