php – 为什么在引用的值上调用函数(如strlen,count等)这么慢?

前端之家收集整理的这篇文章主要介绍了php – 为什么在引用的值上调用函数(如strlen,count等)这么慢?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我刚刚发现了一些非常奇怪的 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);
?>

这一直在我的机器上运行大约20秒(在PHP 5.3上).

但是,如果我改变函数来传递值(即函数TestCount($aArray)而不是函数TestCount(& $aArray)),那么它运行在大约2ms – 字面上就是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);
?>

这很快运行,但是如果将函数CalledFunc(& $aData)更改为函数CalledFunc($aData),则会看到类似的计数示例.

这是非常令人担忧的,因为我已经编码了PHP一段时间,我不知道这个问题.

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

猜你在找的PHP相关文章