Erlang等函数式编程语言的尾递归很好用,前一阵我想测试一下PHP5.3有没有针对尾递归优化,对比递归、尾递归和迭代三者之间的性能差异,依据网上关于斐波那契数算法改成PHP语法,进行了一次不太准确的效率测试,发现递归花费时间是迭代的4倍以上,尾递归花费时间比递归还要多花费30%到50%的时间。
不过期间我不小心按错了快捷键,导致在PHP不同的版本运行,其结果的差异完全出乎意料,于是我下载了最新的PHP5.2.14和PHP5.3.3几个版本,分别进行测试,以下是测试结果:
测试环境:
CPU:Inetl Celeron CPU 900 @2.2G
RAM:2G
OS: Windows 7 专业版
不同版本的运行结果:
PHP版本 迭代 递归 尾递归
php-5.2.14-nts-Win32-VC6-x86 0.146471024 1.328943014 1.41772294
php-5.2.14-Win32-VC6-x86 0.20116806 1.61998105 2.56595993
php-5.3.3-nts-Win32-VC6-x86 0.117762089 0.485166073 0.67838192
php-5.3.3-nts-Win32-VC9-x86 0.110873938 0.462769985 0.680724144
php-5.3.3-Win32-VC6-x86 0.132544041 0.724455833 0.968312025
php-5.3.3-Win32-VC9-x86 0.160384893 0.726171017 1.029062986
结论:
* 多次运行的结果略有差异,但并不影响大致结论
- PHP5.3.3递归的效率比PHP5.2.14大幅度提升
- ThreadSafe版本比非ThreadSafe版本的效率低20%以上,尽量使用FastCGI
- PHP5.3.3尾递归并没有被优化,递归层级仍然受到限制,并且在性能上比普通递归也没有优势,大概是由于需要多传参数的缘故反而损失性能
- VC9编译出的PHP比VC6编译出的在效率上并没有明显提升
继续测试PHP5.3.3与PHP5.2.14两个非ThreadSafe版本在字符串处理上的效率