php - 为什么对引用值调用函数(例如 strlen、count 等)如此慢?

标签 php performance reference pass-by-reference

我刚刚在 PHP 中发现了一些非常奇怪的东西。

如果我通过引用将变量传递给函数,然后在其上调用函数,则速度令人难以置信慢。

如果循环内部函数调用并且变量很大,则可能比按值传递变量慢许多数量级。

示例:

<?php
function TestCount(&$aArray)
{
    $aArray = range(0, 100000);
    $fStartTime = microtime(true);

    for ($iIter = 0; $iIter < 1000; $iIter++)
    {
        $iCount = count($aArray);
    }

    $fTaken = microtime(true) - $fStartTime;

    print "took $fTaken seconds\n";
}

$aArray = array();
TestCount($aArray);
?>

在我的机器(PHP 5.3)上运行它始终需要大约 20 秒。

但是如果我将函数更改为按值传递(即 function TestCount($aArray) 而不是 function TestCount(&$aArray)),那么它会运行在大约 2 毫秒 - 快了 10,000 倍!

对于其他内置函数(例如 strlen)和用户定义函数也是如此。

发生什么事了?

最佳答案

我发现 2005 年的错误报告准确描述了这个问题:http://bugs.php.net/bug.php?id=34540

所以问题似乎是,当将引用值传递给不接受引用的函数时,PHP 需要复制它。

这可以通过以下测试代码进行演示:

<?php
function CalledFunc(&$aData)
{
    // Do nothing
}

function TestFunc(&$aArray)
{
    $aArray = range(0, 100000);
    $fStartTime = microtime(true);

    for ($iIter = 0; $iIter < 1000; $iIter++)
    {
        CalledFunc($aArray);
    }

    $fTaken = microtime(true) - $fStartTime;

    print "took $fTaken seconds\n";
}

$aArray = array();
TestFunc($sData);
?>

它运行得很快,但如果将function CalledFunc(&$aData)更改为function CalledFunc($aData),您会看到与计数示例。

这相当令人担忧,因为我已经编写 PHP 代码很长一段时间了,而且我对这个问题一无所知。

幸运的是,有一个适用于许多情况的简单解决方法 - 在循环内使用临时局部变量,并在最后复制到引用变量。

关于php - 为什么对引用值调用函数(例如 strlen、count 等)如此慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3117604/

相关文章:

php - 有没有办法在 cakephp 中关闭 mysql 连接?

C vs MATLAB(制作一个元素为均匀分布的随机数的矩阵)

java - PatternLayout (log4j) 的 C、F、L、l 和 M 到底有多慢?

引用、对象和指针之间的 C++ 区别

c++ - 传递指针 - 用于写入流

php - jQuery Ajax PHP 重定向到另一个页面

php - 当在不同页面上单击 anchor 标记时,如何更改 php 脚本中的 PHP 变量?

php - 用于使用 PHP 解析 xml 文件的 simpleXML 的替代方法

c - C中字母表排序组合的多线程计算

swift - Swift 类中的属性是否会自动引用?