我最近正在做一些PHP工作,在我看过的所有代码中,人们倾向于使用很少的方法。 (他们也倾向于使用很少的变量,但这是另一个问题。)我想知道为什么会这样,我发现这个音符“一个带有一个参数的函数调用和一个空函数体大约需要7-8美元一样的时间localvar ++ operations。一个类似的方法调用当然是15 $ localvar ++ operations“here。
这是真的,即使PHP页面已经编译和缓存了吗?我应该尽可能避免使用方法来提高效率吗?我喜欢用重复代码块的方法编写组织良好,人类可读的代码。如果有必要在没有方法的情况下编写平面代码,是否有任何程序可以“内联”方法体?这样我就可以编写好的代码,然后在部署之前将其弄糟。
顺便说一句,我一直在看的代码来自Joomla 1.5核心和几个WordPress插件,所以我认为他们是知道他们在做什么的人。
注意:我很高兴每个人都跳过这个问题来讨论优化一般,但事实上我们正在谈论解释语言的优化。至少有一些暗示我们谈论PHP的事实会很好。
答案 0 :(得分:75)
您需要多少“效率”?你有测量吗?过早优化是所有邪恶的根源,没有测量的优化总是为时过早。
还要记住rules of Optimization Club。
答案 1 :(得分:57)
我认为Joomla和Wordpress不是好的 PHP代码的最好例子,没有冒犯。我没有任何个人反对从事这项工作的人,并且很高兴他们如何让人们拥有一个网站/博客,我知道很多人将所有的空闲时间花在这两个项目中,但代码质量相当差(没有冒犯)。
如果您不相信我,请查看过去一年的安全公告;也假设你正在寻找两者中的任何一个的表现,他们的代码也不会出类拔萃。所以它绝不是好的代码,但Wordpress和Joomla都在前端上表现出色 - 非常容易使用,人们可以获得一个网站,并且可以做的东西。
这就是为什么他们如此成功,人们不会根据代码质量选择它们,而是选择它们使他们能够做到的事情。
要回答您的性能问题,是的,所有好的东西(函数,类等)都会减慢您的应用程序速度。所以我想如果你的应用程序/脚本都在一个文件中,那就这样吧。随后可以编写错误的PHP代码。
一旦扩展并开始复制代码,您应该考虑编写可维护代码带来的权衡(速度)。 : - )
恕我直言,由于两件事,这种交易相当小:
当你需要在六个月内回到代码中时,想一想如果那些nano秒运行它,当你需要修复一个令人讨厌的错误时仍会加起来(三四次,因为重复的代码)。
你可以做各种各样的事情来让PHP运行得更快。通常人们会推荐缓存,例如APC。 APC非常棒。它会在后台为您运行各种优化,例如:缓存PHP文件的字节码,并在userland中为您提供保存数据的功能。
因此,例如,如果每次运行该脚本时解析配置文件,则i / o非常重要。使用简单的apc_store()和apc_fetch(),您可以将已解析的配置文件存储在基于文件或基于内存的(RAM)缓存中,并从那里检索它,直到缓存过期或被删除。 / p> 当然,APC不是唯一的缓存。
答案 2 :(得分:21)
您应该看到对此问题的回复:Should a developer aim for readability or performance first?
总结共识:除非您知道(通过测试/分析)您的性能需要在某个特定领域得到解决,否则可读性就更为重要。
答案 3 :(得分:9)
在99%的情况下,您最好担心代码可理解性。编写易于测试,理解和维护的代码。
在性能确实至关重要的少数情况下,像PHP这样的脚本语言不是您的最佳选择。毕竟,PHP中的许多基本库函数都是用C语言编写的。
答案 4 :(得分:8)
就个人而言,虽然函数调用可能有开销,但如果它意味着我编写了一次代码(参数化),然后在85个地方使用它,那么我就 WAY 因为我可以把它固定在一个地方。
脚本语言倾向于让人们认为“足够好”和“有效”是编码时唯一要考虑的标准。
答案 5 :(得分:5)
特别是对于像PHP这样的快速解释器,我认为缺乏可读性/可维护性并不值得你从(也可能不会)获得它的效率。
关于WordPress的说明:我已经做了很多浏览WordPress代码。请不要认为那些人对优秀代码一无所知。
答案 6 :(得分:4)
回答你的第一个问题,是的,这对于编译的操作码也是如此。是的,您可以通过避免函数调用来提高代码速度,除非在代码重复导致代码变得过大的极端情况下。
你应该做你喜欢的事情“我喜欢用重复代码块的方法编写组织良好,人类可读的代码。”
如果您要提交删除所有函数调用的这种可怕的暴行,至少使用一个分析器并且只对您重要的10%代码执行此操作。
答案 7 :(得分:3)
微优化如何导致宏观减速的一个例子:
如果您正在认真考虑手动内联函数,请考虑手动展开循环。
JMP很昂贵,如果您可以通过展开来消除循环并消除所有条件块,那么您将消除浪费在CPU缓存周围的所有时间浪费。
运行时的变量扩充也很慢,就像从数据库中取出一样,所以你应该将所有数据内联到你的代码中。
实际上,加载一个解释器只是为了执行代码并将内存复制给用户是非常浪费的,为什么我们不只是预先计算所有可能的页面并将每个页面存储在内存中准备就绪,所以它只是一个MEM-副本?肯定那很快!
啊,现在我们之间有一个叫做互联网的缓慢的东西,它阻碍了用户体验,限制了我们可以使用的内容,我们如何提前预先计算页面,并将它们归档并运行他们在用户本地机器上?那真的很快!
但这会浪费cpu周期,其中很多,页面加载时间和浏览器内容呈现等等,我们将跳过中间人,只是在打印媒体上将页面传递给他们!天才!
/我看着你的公司崩溃,而你花了10年预先计算(手工)和打印页面没有人想看到。
这对你来说听起来很愚蠢,但对于我们其他人来说,你提出的建议就是那么荒谬。
优化是好的,但是在合理的地方划清界线,这样你就不必担心未来的人会在你的睡眠中跟踪你的代码,因为这样一个糟糕的代码库是无法维护的。
注意:是的,我使用gentoo。你是怎么猜的?
答案 8 :(得分:2)
当然你不应该写错误的PHP代码。但是一旦你写了一些不好的东西,你可能总是以性能为借口: - )
答案 9 :(得分:2)
这是不成熟的优化。虽然声明函数调用的成本高于增加局部整数变量(几乎所有成本都更高),但与数据库查询相比,函数调用的成本仍然很低。
另见:
答案 10 :(得分:1)
PHP的主要优势在于可以快速轻松地获得有效的应用程序。这种力量来自于编写松散(坏)代码的机会,并且仍然以某种预期的方式运行。
如果您需要节省几个CPU周期,PHP就不是您应该使用的。当PHP Web应用程序表现不佳时,由于查询效率低下而不是代码执行的速度,这种可能性更大。
答案 11 :(得分:1)
如果您对效率感到担心,那么为什么您使用的是脚本语言呢?你应该用更快的语言编程(在这里插入你最喜欢的编译语言),可能导致更多,更不易读的代码,但它运行得非常快,你仍然可以瞄准最佳的编码实践。
说真的,如果你要编写运行速度,你就不应该使用PHP。
答案 12 :(得分:0)
如果您使用MVC架构模式开发Web应用程序,则可以从缓存和序列化中获益匪浅。您可以缓存视图或部分视图,也可以序列化模型。
根据经验,模型通常会解析并生成大部分正在显示的数据。如果您知道某个模型不会经常生成新数据,比如解析RSS提要的模型,您可以将其填充到所有已解析数据的某个位置,并且每隔一段时间刷新一次。
答案 13 :(得分:0)
如果你看一下wordpress php代码,它会在它的html之间混合使用php标签,这会在我的脑海中产生意大利面。
然而,Phpbb3在这方面更好。例如,它在php部分和样式部分之间有严格的划分,它们是带有{template}标签的xhtml格式文件,由模板引擎解析。哪个更清洁。答案 14 :(得分:0)
写几个10分钟的示例并在您的探查器中运行它们。
这会告诉你哪个更快到毫秒。
如果您没有分析器,请在此处发布,我将在我的PHPEd分析器中运行它们。
我怀疑大部分时间差异(如果有的话)来自于必须打开存储类的文件,但是也必须进行测试。
然后问问自己,你是否需要花费几毫秒的时间来维护意大利面条代码 - 你的用户会注意到吗?
修改强>
探查器不会模拟高流量,但它会告诉您哪个方法对单个用户更快,以及代码的哪些部分使用了多长时间。特别是如果您对重复执行的操作进行分析 - 比如循环中每次执行1000次。
我们可以假设(虽然并非总是如此)很多人使用的更快的代码会比很多人使用的代码慢。
答案 15 :(得分:0)
那些将为您介绍代码微优化的人通常是每页有50个SQL查询,总共需要2秒,因为他们从未听说过分析。但是他们的代码得到了优化! (和地狱一样慢)
事实:添加另一个网络服务器并不困难。复制数据库是。 如果在数据库上增加负载,优化网络服务器代码可能是一个净损失。
注意:简单页面(如论坛主题)2-3毫秒,包括SQL是PHP网站的一个很好的目标。我的旧网站曾经这样做过。