PHP具有处理递归的能力

时间:2009-12-31 20:24:44

标签: php recursion

我最近在一些地方看到人们说PHP的递归能力很差。最近我为图遍历编写了一个递归的php函数,发现它与java相比非常慢。我不知道这是因为php的递归能力还是因为php通常比java慢。

一些谷歌搜索透露了这个(http://bugs.php.net/bug.php?id=1901

  

[1999年8月7日下午12:25 UTC] zeev at cvs dot php dot net

     

PHP 4.0(Zend)使用堆栈   密集的数据,而不是使用   堆。这意味着它的容忍度   递归函数是显着的   低于其他语言。

     

告诉Zend不是很容易   使用堆栈来获取此数据,以及   使用堆 - 而不是   大大增加了数量   递归函数可能 - 在   降价的价格。如果你是   对这样的环境感兴趣,让我来   知道,我们可能会添加一个编译时   开关。

说php使用堆栈进行密集数据是什么意思? php没有设置运行时堆栈吗?另外,一般情况下,php中的递归比其他语言慢得多吗?多少钱?

谢谢!

2 个答案:

答案 0 :(得分:2)

好的,我会捅它。

首先:“堆栈”是标准C / C ++类型程序中用于函数调用跟踪的区域。它是操作系统和编程语言约定在内存中定义的地方,它被视为堆栈(数据结构)。当您调用C函数fibbonaci(int i)时,它会将变量 i 和已经忙于调用它的函数的返回地址放在堆栈上。这需要一些记忆。完成该函数调用后,内存再次可用。堆栈的大小有限。如果您在其上存储非常大的变量并进行许多递归调用,那么您可能会用完房间。正确?

所以.....

显然,Zend有两种分配数据的方法:在堆上(一个更通用的区域来请求内存)和堆栈,而堆栈是一个更有效的地方,因为事物的编程方式。 (我不知道为什么,但我可以猜到。可能存在非常低级别的缓存问题 - 我希望堆栈在L1或L2缓存中比堆中的任意内存更有可能,因为CPU是很可能非常频繁地使用该区域 - 实际上每次调用函数时。堆数据访问也可能存在分配开销。)

我认为,在这种情况下,“强化”数据是指很可能很快或很常使用的数据。对这些变量使用更快的基于堆栈的分配是有意义的。你肯定会很快使用什么样的变量?那么,函数的参数怎么样?你很可能会使用它们:否则你为什么要打扰它们呢?它们也可能更像是小数据项(引用大量数据结构而不是大量数据结构本身 - 因为这会给你复制开销等等)。因此堆栈可能对于为大多数PHP程序员存储PHP函数参数是有意义的......但它在递归时会很快失败。

希望至少回答“这是什么意思?”。对于您的递归性能问题:自己进行基准测试;它可能取决于你想要做什么样的递归。

答案 1 :(得分:0)

猜测一下,我会说你的问题不在于递归本身。对于很多东西,Java比PHP快得多。有一些方法可以改善PHP的性能。

然而,PHP递归限制导致PHP耗尽堆栈并崩溃,带有可怕的“堆栈溢出”消息(双关语意图)。此时,您的程序将停止执行。

如果PHP使用动态堆栈,由于将堆栈重新分配到更大的内存块所花费的时间,您可能会看到一些(温和)减速。

无论如何,我需要更多地了解你正在做些什么来确定你的性能问题,这是我为生活所做的事情......