我最近在一些地方看到人们说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
好的,我会尝试一下。
第一:“堆栈”是标准C/C++类型程序中用于函数调用跟踪的区域。它是操作系统和编程语言约定在内存中定义的位置,并且将其视为堆栈(数据结构)。当您调用 C 函数 fibbonaci(int i) 时,它将变量i以及已经忙于调用它的函数的返回地址放在堆栈上。这需要一些记忆。当该函数调用完成后,内存再次可用。堆栈的大小是有限的。如果您在其上存储非常大的变量并进行许多递归调用,那么您可能会耗尽空间。正确的?
所以.....
显然,Zend 有两种分配数据的方法:在堆上(从中请求内存的更通用的区域)和在堆栈上,并且由于编程方式,堆栈是更有效的地方。(我不知道为什么,但我可以猜测。可能存在非常低级的缓存问题 - 我预计堆栈更有可能位于 L1 或 L2 缓存中,而不是堆中的任意内存,因为 CPU很可能非常频繁地使用该区域 - 事实上,每次调用函数时。堆数据访问也可能存在分配开销。)
我认为,在这种情况下,“密集”数据是指很可能很快或经常使用的数据。对这些变量使用更快的基于堆栈的分配是有意义的。您肯定会很快使用哪种变量?那么,函数的参数怎么样?您很可能会使用这些:否则您为什么要费心传递它们呢?它们也可能是小数据项(引用大量数据结构而不是大量数据结构本身 - 因为这会给您带来复制开销等)。因此,对于大多数 PHP 程序员来说,堆栈对于存储 PHP 函数参数可能是有意义的……但它在递归中会更快失败。
希望这至少能回答“这是什么意思?”。对于您的递归性能问题:自己进行基准测试;这可能取决于您想要执行哪种递归。