我刚刚在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秒到达断点 第二个示例几乎是在