我最近在一些地方看到人们说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中的递归比其他语言慢得多吗?多少钱?
谢谢!
答案 0 :(得分:2)
好的,我会捅它。
首先:“堆栈”是标准C / C ++类型程序中用于函数调用跟踪的区域。它是操作系统和编程语言约定在内存中定义的地方,它被视为堆栈(数据结构)。当您调用C函数fibbonaci(int i)
时,它会将变量 i 和已经忙于调用它的函数的返回地址放在堆栈上。这需要一些记忆。完成该函数调用后,内存再次可用。堆栈的大小有限。如果您在其上存储非常大的变量并进行许多递归调用,那么您可能会用完房间。正确?
所以.....
显然,Zend有两种分配数据的方法:在堆上(一个更通用的区域来请求内存)和堆栈,而堆栈是一个更有效的地方,因为事物的编程方式。 (我不知道为什么,但我可以猜到。可能存在非常低级别的缓存问题 - 我希望堆栈在L1或L2缓存中比堆中的任意内存更有可能,因为CPU是很可能非常频繁地使用该区域 - 实际上每次调用函数时。堆数据访问也可能存在分配开销。)
我认为,在这种情况下,“强化”数据是指很可能很快或很常使用的数据。对这些变量使用更快的基于堆栈的分配是有意义的。你肯定会很快使用什么样的变量?那么,函数的参数怎么样?你很可能会使用它们:否则你为什么要打扰它们呢?它们也可能更像是小数据项(引用大量数据结构而不是大量数据结构本身 - 因为这会给你复制开销等等)。因此堆栈可能对于为大多数PHP程序员存储PHP函数参数是有意义的......但它在递归时会很快失败。希望至少回答“这是什么意思?”。对于您的递归性能问题:自己进行基准测试;它可能取决于你想要做什么样的递归。
答案 1 :(得分:0)
猜测一下,我会说你的问题不在于递归本身。对于很多东西,Java比PHP快得多。有一些方法可以改善PHP的性能。
然而,PHP递归限制导致PHP耗尽堆栈并崩溃,带有可怕的“堆栈溢出”消息(双关语意图)。此时,您的程序将停止执行。
如果PHP使用动态堆栈,由于将堆栈重新分配到更大的内存块所花费的时间,您可能会看到一些(温和)减速。
无论如何,我需要更多地了解你正在做些什么来确定你的性能问题,这是我为生活所做的事情......