2009-12-31 112 views
5

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

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

[1999年8月7日下午12:25 UTC]兹夫在CVS点PHP点网

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

这是比较容易的Zend讲不 使用栈这一数据,并 使用堆,而不是 - 这将 大大增加 可能递归函数的数量 - 在 价格降低速度。如果您对 感兴趣,请告诉我 这样的设置,我们可能会添加一个编译时间 开关。

这是什么意思说,PHP使用密集的数据堆栈? PHP没有设置运行时栈?另外,一般来说,PHP中的递归比其他语言慢得多?并通过多少?

谢谢!

+6

圣古修正的bug蝙蝠侠! – cgp 2009-12-31 20:33:05

+2

altCognito有一点。你甚至使用PHP4?或者你是5岁? – fennec 2009-12-31 20:48:35

回答

2

好的,我会试一试。

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

所以.....

显然的Zend有两种方式来分配数据:在堆上(一个更一般的区域,以请求从存储器)和在堆栈上,且堆栈的更有效的位置由于事物的编程方式而拥有它们。 (我不知道为什么,但我可以猜到,可能会有非常低级别的缓存问题 - 我认为堆栈更有可能位于L1或L2缓存中,而不是堆中的任意内存,因为CPU是很可能非常频繁地使用该区域 - 实际上,每当您调用某个函数时,也可能存在堆数据访问的分配开销。)

我相信在此上下文中的“密集”数据是指数据这很可能很快或很常用。对这些变量使用更快速的基于堆栈的分配是有意义的。你肯定会很快使用哪些变量?那么,函数的参数怎么样?你很可能会使用这些:否则为什么你会困扰他们呢?他们也可能是小数据项目(引用大量的数据结构,而不是大规模的数据结构本身 - 因为这会让您复制开销等等)。所以这个堆栈对于为大多数PHP程序员存储PHP函数参数可能是有意义的......但是它在递归中更快地失败。

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

+0

@Eric:关于衡量性能的主题,XDebug提供了PHP性能分析(http://xdebug.org/docs/profiler)。 – outis 2009-12-31 20:50:52

0

在猜测,我会说你的问题在于递归本身以外的地方。对于很多事情来说,Java比PHP快很多。有一些方法可以提高PHP的性能。

但是,PHP递归限制导致PHP在堆栈中崩溃并导致崩溃,并带有令人畏惧的'堆栈溢出'消息(双向打算)。此时,您的程序停止执行。

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

无论如何,我需要知道更多一点关于你在做找准你的性能问题,这是我为生活做什么...