当前位置: 首页 > 面试题库 >

为什么在参考值上调用函数(例如strlen,count等)这么慢?

司马羽
2023-03-14
问题内容

我刚刚在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)你会看到一个类似的放缓到count的例子。

这让我很担心,因为我已经编码PHP了很长时间,而且我对这个问题一无所知。

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



 类似资料:
  • 问题内容: 我用 和做了一些测试 。他们似乎都慢于。是因为精度更高吗?计算斜边函数的方法是什么?令人惊讶的是,我在文档中找不到任何表明性能不佳的迹象。 问题答案: 这不是一个简单的sqrt函数。您应该检查此链接以实现算法:http : //www.koders.com/c/fid7D3C8841ADC384A5F8DE0D081C88331E3909BF3A.aspx 它具有while循环以检查收

  • 问题内容: 我一直基于Java的缓慢性而避免使用Java反射soley。我在当前项目的设计中达到了可以使用它的目的,这将使我的代码更具可读性和雅致性,因此我决定尝试一下。 两者之间的差异让我感到惊讶,有时我发现运行时间几乎快了100倍。即使在这个仅实例化一个空类的简单示例中,它也是令人难以置信的。 真的,我的问题是 为什么这么慢?我在做错什么吗?(即使上面的示例也说明了区别)。我很难相信它真的比普

  • 问题内容: 我在课堂上有这个功能: 我尝试使用此函数来调用该函数: 问题是编译器希望它看起来像这样: 为什么第一个会导致错误? 问题答案: Swift 2.0更新 :现在,默认情况下,函数的功能与方法相同,并且对于两种方法而言: 第一个参数没有外部名称;和 其他参数的外部名称与内部名称相同。 除此之外,下面的规则仍然适用,只是速记语法已消失。 这是一个更一般的答案:函数在类之外定义为真函数时以及在

  • 在一些phpmyadmin库中,有一系列与逻辑错误相关的问题,但它们似乎都与此略有不同。 我对“设计师”选项卡中的这种奇怪行为感到有点不知所措。我被告知“已在服务器上检测到错误!”我应该“查看此窗口的底部”,但正如您从图像中看到的,控制台中没有任何内容,错误消息也不清楚: 每次打开Designer选项卡时都会出现此弹出窗口后,我决定跟踪它: ... 查看/usr/share/phpmyadmin/

  • 我注意到,当我使用条件断点进行调试时,执行速度会大大减慢。我知道这一点已经有一段时间了,现在想明白为什么。到底是什么原因导致执行如此缓慢?我知道正在添加一个条件,但是如果我自己添加条件,我不会减慢执行速度。 例如,假设我们有以下代码。假设我们添加了一个条件断点。让我们将条件设置为i==10000。 现在让我们自己写条件。 90秒完成击球(包括开始的9秒) 日食: ~9秒到达断点 第二个示例几乎是在