php - 静态方法与函数的性能

标签 php performance oop

在 PHP 中,(与我最初的想法不同)调用静态方法与调用简单函数会产生开销。

在一个非常简单的工作台上,开销超过调用时间的 30% (该方法只返回参数):

// bench static method
$starttime = microtime(true);
for ($i = 0; $i< 10*1000*1000; $i++)
    SomeClass::doTest($i);

echo "Static Time:   " , (microtime(true)-$starttime) , " ms\n";

// bench object method
$starttime = microtime(true);

for ($i = 0; $i< 10*1000*1000; $i++)
    $someObj->doTest($i);

echo "Object Time:   " , (microtime(true)-$starttime) , " ms\n";

// bench function
$starttime = microtime(true);

for ($i = 0; $i< 10*1000*1000; $i++)
    something_doTest($i);

echo "Function Time: " , (microtime(true)-$starttime) , " ms\n";

输出:

Static Time:   0.640204906464 ms
Object Time:   0.48961687088 ms
Function Time: 0.438289880753 ms

我知道实际时间仍然可以忽略不计,除非我实际上调用了 100 万次,但事实是它就在那里。

有人愿意尝试解释幕后发生的事情吗?

更新:
- 添加了对象方法台

最佳答案

显然这一点已在 PHP (5.5.12) 的更高版本中得到修复。

我运行了 OP 的代码(使用空方法),我得到了这些结果:

Static Time:   1.0153820514679 ms
Object Time:   1.100515127182 ms

编辑:八个月后发布一些版本......

看看 Zend 和社区如何努力提高 PHP 的性能很有趣。

🐘 PHP 5.6

这是与 PHP 5.6.9 (ZE 2.6) 相同的基准:

Static Time:   0.97488021850586 ms
Object Time:   1.0362110137939 ms
Function Time: 0.96977496147156 ms

在一次运行中,“对象时间”甚至比静态时间还要快,所以现在它们非常接近。更好的是,我们可以看到对象几乎像函数一样快!

🐘 PHP 7.0

我还编译了 PHP 7.0 alpha 1 (ZE 3.0),看到像 PHP 这样快速的语言是多么令人惊奇(与其他动态语言相比)如您所见的语言 herehere ) 可以一次又一次地优化:

Static Time:   0.33447790145874 ms
Object Time:   0.30291485786438 ms
Function Time: 0.2329089641571 ms

在PHP7中,基本功能得到了极大的优化,“静态时间”再次比“实例/对象时间”慢。

编辑,2015 年 10 月一年后:PHP 7.0 RC5。现在,“静态时间”更快了。 需要注意的重要一点: 标量类型提示(PHP7 中的新功能)会带来很大的开销,它会慢 16% 左右(类型提示不会让您的代码慢 16% ,当您的代码仅由函数调用组成时,速度会更慢;)在现实生活中的应用程序中,这可以忽略不计)。这样的开销可能看起来不合逻辑,但是当您知道动态类型是 PHP 的核心时,它就不那么令人惊讶了。与其他更静态的语言相反,PHP 中的类型提示意味着 more 检查 Zend 引擎,而不是像我们中的某些人所期望的那样 less。 future ,我们可能会在这一点上获得更多的运行时优化(就像 HHVM 的运行时代码分析和 JiT 方法一样)。不要忘记 PHP7 还很年轻,为这个版本所做的所有清理工作都允许将来在功能和性能方面得到很大的改进。

🐘 HHVM

针对 HHVM 3.7.1 的测试仍然表明 HHVM 在这类基准测试中很容易获胜,在这里您可以看到 JiT 编译的好处(JiT 是PHP future 版本的“计划”功能,我们可能会在 7.x 或 8.x 分支中获得它。Zend had created a PoC, as an OpCache extension):

Static Time:   0.070882797241211 ms
Object Time:   0.23940300941467 ms
Function Time: 0.06760311126709 ms

对于 HHVM,函数和静态方法的时序非常相似,这可以让我们认为,在内部,它们几乎是相同的东西(毕竟,静态方法与命名空间函数非常相似)。与其他实例相比,实例时间是“灾难性的”。这表明 HHVM 和 ZE 是非常不同的引擎。

结论?

无法保证其中一种做法(静态/实例)会永远保持更快。使用在软件设计方面看起来最好的东西,并在现有应用程序中保留连贯的代码。

如果您有选择,和/或如果您正在编写库等,那么也许您可以使用实例方法,它对 DI 环境更友好,并且为使用您的 API 的开发人员提供了更多控制权。

如果您只是提供实用功能(例如 npm 生态系统中的那些小包),那么您可以使用命名空间功能(但请注意 PHP still doesn't have function autoloading ,这意味着 Composer can't lazy-load your library 就像它对 PSR-0/4 所做的那样)

关于php - 静态方法与函数的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1472721/

相关文章:

mysql - 单独的 MySQL INSERT 语句与先写入本地 CSV 然后加载数据

php - 如何将 "OR"条件运算符附加到 MySQL 动态查询 (PHP)?

php - 在一个选项中从数据库发布多个值

隐藏/显示嵌套表格时 Javascript 性能受到影响

performance - 游戏性能优化访谈

java - 如何用不同的数据表示相似的对象

Java 包级访问

java - 如何构建简单的 Android 应用程序

php - 如何检查在 php 中完成的 bash shell

php - 每 24 小时执行一个 php 页面