收藏 分享(赏)

php5.2与5.3性能比较.docx

上传人:hwpkd79526 文档编号:6784035 上传时间:2019-04-22 格式:DOCX 页数:14 大小:328.90KB
下载 相关 举报
php5.2与5.3性能比较.docx_第1页
第1页 / 共14页
php5.2与5.3性能比较.docx_第2页
第2页 / 共14页
php5.2与5.3性能比较.docx_第3页
第3页 / 共14页
php5.2与5.3性能比较.docx_第4页
第4页 / 共14页
php5.2与5.3性能比较.docx_第5页
第5页 / 共14页
点击查看更多>>
资源描述

1、PHP5.2 与 5.3 相关比较在递归测试、数值运算测试、字符串操作测试、 类和对象测试上 5.3 性能明显高于5.2,提升大约 15%-40%,不过在内存消耗上 5.3 大于 5.2, IO 操作速度基本相同。环境 1: IIS7+PHP5.3.13环境 2: IIS7+PHP5.2.131. 测试递归函数采用交换排序算法对 1 万个数值元素的数组排序 30 次,此测试主要测试 5.2 与 5.3 在递归调用方面的性能。1 )$key = $arr0;$min = array( );$max = array( );for( $i = 1; $i $key )$max = $arr$i;el

2、se$min = $arr$i;$min = count( $min ) 0 ? quickSort( $min ) : $min;$max = count( $max ) 0 ? quickSort( $max ) : $max;return array_merge( $min, array( $key ), $max );elsereturn $arr;/程序运行时间$runTimeNum = 0;$runTime = 0;for( $i = 0; $i ;echo Memory usage: . memory_get_usage();?测试结果:PHP5.3.23: Running ti

3、me: 0.236173868179320.26386793454488Memory usage:1197432PHP5.2.13: Running time: 0.391258269945780.41212603251139Memory usage:8499202.测试数值计算对指定范围数值做循环加减法操作。;echo Memory usage: . memory_get_usage();测试结果PHP5.3.23: Running time: 0.172901144027710.22068405151367Memory usage: 324440PHP5.2.13: Running tim

4、e: 0.24252295494080.32152795791626Memory usage: 543603.字符串运算对字符串做一百万次拼接操作。;echo Memory usage: . memory_get_usage();测试结果PHP5.3.23: Running time: 1.07133197784421.2021548748016Memory usage: 13212064PHP5.2.13: Running time: 1.32380199432371.1623599529266Memory usage: 129417524.类和对象速度测试实例化一百万次指定类并调用其类方法

5、。testA = $num;public function getNum()return $this-testA;/程序运行时间$runTime = 0;$j = 0;$str = ;while( $j getNum();$runTime = getMsecTime() - $startTime;echo Running time: , $runTime , ;echo Memory usage: . memory_get_usage();测试结果PHP5.3.23: Running time: 2.17981600761412.4962770938873Memory usage: 32656

6、0PHP5.2.13: Running time: 4.42904710769654.818235874176Memory usage: 565365.文件 IO 操作速度测试测试建立、删除、检测文件和文件夹及向文件内写入数据。;echo Memory usage: . memory_get_usage();测试结果PHP5.3.23: Running time: 0.37659287452698 0.46596193313599Memory usage: 326360PHP5.2.13: Running time: 0.351083993911740.46643400192261Memory

7、 usage: 56296PHP 中的垃圾回收算法5.2 中的垃圾回收算法 Reference CountingPHP5.2 中使用的内存回收算法是大名鼎鼎的 Reference Counting,这个算法中文翻译叫做“引用计数” ,其思想非常直观和简洁:为每个内存对象分配一个计数器,当一个内存对象建立时计数器初始化为 1(因 此此时总是有一个变量引用此对象),以后每有一个新变量引用此内存对象,则计数器加 1,而每当减少一个引用此内存对象的变量则计数器减 1,当垃圾回收机制 运作的时候,将所有计数器为 0 的内存对象销毁并回收其占用的内存。而PHP 中内存对象就是 zval,而计数器就是 re

8、fcount_gc。Reference Counting 简单直观,实现方便,但却存在一个致命的缺陷,就是容易造成内存泄露。很多朋友可能已经意识到了,如果存在循环引用,那么 Reference Counting 就可能导致内存泄露。例如下面的代码:这段代码首先建立了数组 a,然后让 a 的第一个元素按引用指向 a,这时 a 的 zval 的refcount 就变为 2,然后我们销毁变量 a,此时 a 最初指向的 zval 的 refcount 为 1,但是我们再也没有办法对其进行操作,因为其形成了一个循环自引用,如下图所示:其中灰色部分表示已经不复存在。由于 a 之前指向的 zval 的 re

9、fcount 为 1(被其HashTable 的第一个元素引用) ,这个 zval 就不会被 GC 销毁,这部分内存就泄露了。这里特别要指出的是,PHP 是通过符号表 (Symbol Table)存储变量符号的,全局有一个符号表,而每个复杂类型如数组或对象有自己的符号表,因此上面代码中,a 和 a0是两个符号,但是 a 储存在全局 符号表中,而 a0储存在数组本身的符号表中,且这里 a 和a0引用同一个 zval(当然符号 a 后来被销毁了)。希望读者朋友注意分清符号 (Symbol)的zval 的关系。在 PHP 只用于做动态页面脚本时,这种泄露也许不是很要紧,因为动态页面脚本的生命周期很短

10、,PHP 会保证当脚本执行完毕后,释放其所有资源。但是 PHP 发展到目前已经不仅仅用作动态页面脚本这么简单,如果将 PHP 用在生命周期较长的场景中,例如自动化测试脚本或 deamon 进程,那么经过多次循环 后积累下来的内存泄露可能就会很严重。5.3 中的垃圾回收算法 Concurrent Cycle Collection in Reference Counted SystemsPHP5.3 的垃圾回收算法仍然以引用计数为基础,但是不再是使用简单计数作为回收准则,而是使用了一种同步回收算法,这个算法由 IBM 的工程师在论文 Concurrent Cycle Collection in R

11、eference Counted Systems 中提出。此算法的基本思想:首先 PHP 会分配一个固定大小的 “根缓冲区”,这个缓冲区用于存放固定数量的 zval,这个数量默认是 10,000,如果需要修改则需要修改源代码 Zend/zend_gc.c 中的常量GC_ROOT_BUFFER_MAX_ENTRIES 然后重新编译。由上文我们可以知道,一个 zval 如果有引用,要么被全局符号表中的符号引用,要么被其它表示复杂类型的 zval 中的符号引用。因此在 zval 中存 在一些可能根(root)。这里我们暂且不讨论 PHP 是如何发现这些可能根的,这是个很复杂的问题,总之 PHP 有办

12、法发现这些可能根 zval 并将它们投入 根缓冲区.当根缓冲区满额时,PHP 就会执行垃圾回收,此回收算法如下:1、对每个根缓冲区中的根 zval 按照深度优先遍历算法遍历所有能遍历到的 zval,并将每个 zval 的 refcount 减 1,同时为了避免对同一 zval 多次减 1(因为可能不同的根能遍历到同一个 zval),每次对某个 zval 减 1 后就对其标记为“已减 ”。2、再次对每个缓冲区中的根 zval 深度优先遍历,如果某个 zval 的 refcount 不为 0,则对其加 1,否则保持其为 0。3、清空根缓冲区中的所有根( 注意是把这些 zval 从缓冲区中清除而不是

13、销毁它们 ),然后销毁所有 refcount 为 0 的 zval,并收回其内存。如果不能完全理解也没有关系,只需记住 PHP5.3 的垃圾回收算法有以下几点特性:1、并不是每次 refcount 减少时都进入回收周期,只有根缓冲区满额后在开始垃圾回收。2、可以解决循环引用问题。3、可以总将内存泄露保持在一个阈值以下。PHP5.2 与 PHP5.3 垃圾回收算法的性能比较关于两者的性能比较请参考 PHP Manual 中的相关章节:http:/ PHP Manual 中的实验代码和试验结果图:self = $a; 12. if ( $i % 500 = 0 ) 13. 14. echo spr

14、intf( %8d: , $i ), memory_get_usage() -$baseMemory, “n“; 15. 16. 17.? 可以看到在可能引发累积性内存泄露的场景下,PHP5.2 发生持续累积性内存泄露,而PHP5.3 则总能将内存泄露控制在一个阈值以下(与根缓冲区大小有关 )。另外是关于性能方面的对比:这个脚本执行 1000000 次循环,使得延迟时间足够进行对比。然后使用 CLI 方式分别在打开内存回收和关闭内存回收的的情况下运行此脚本:运行时间分别为 6.4s 和 7.2s,可以看到 5.3 的垃圾回收机制会慢一些,但是影响并不大。与垃圾回收算法相关的 PHP 配置可以通

15、过修改 php.ini 中的 zend.enable_gc 来打开或关闭 PHP 的垃圾回收机制,也可以通过调用 gc_enable()或 gc_disable()打开或关闭 PHP 的垃圾回收机制。在 PHP5.3 中即使关闭了垃圾回收机制,PHP 仍然会记录可能根到根缓冲区,只是当根缓冲区 满额时,PHP 不会自动运行垃圾回收,当然,任何时候您都可以通过手工调用 gc_collect_cycles()函数强制执行内存回收。PHP5.3 新功能与不兼容特性:新功能:1.支持命名空间PHP5.3 之后的版本引入了名称空间的支持,此举的好处是不同模块之间分隔方式变得天然纯正,以往 PHP 要实现

16、不同模块之间的划分通常会各为其政,有类 PEAR 或ZendFramework 的, 有像 Drupal 以模块区分等等,在已有项目内引入了第三方库经常会担心是否有全局名称的冲突,PHP5.3 后这种担心可大大减低, 其为我们提供了一种主流解决方案。2.支持 GOTO 语句3 新的静态魔术方法_callStatic.5.2 支持通过魔术方法处理不存在方法的调用, 但其只支持非静态方法, 5.3 版本引入了静态魔术方法。4.新的匿名魔术方法 _invoke.如果对象实现了_invoke 魔术方法就可将其作为函数直接调用,实例化对象之后可用匿名函数的形式直接调用。5.动态调用静态属性。PHP5.2

17、 之前静态方法是不支持用变量指定方法名称并动态调用的, 5.3 之后引入了此功能。6.支持匿名函数(lumbda).5.3 之后引入了匿名函数,对 Javascript 了解的人对其并不陌生它占了 JS 的重头戏,灵活运用匿名函数会带来很多便利,PHP 的匿名函数作用域和 函数的作用域相同,不过可以通过内置语法 USE 传入全局变量,当然也可以在函数内部使用 global 或$GLOBALS 调用全局变量。7.新的三元操作符新三元操作符?:在判断表达式结果为 TRUE 时会返回此判断表达式的结果即 ?:之前的值,False 时返回?: 之后的值。8.全局空间内 const 代替 define(

18、)函数可直接使用9.json_encode 支持强制转换对象 JSON5.3 后的 json_enocde 可通过参数强制转换数组为对象形式 JSON。10.默认启用 SPL 支持。SPL 提供了很多激动人心的特性,具体包括数据结构类、迭代类、接口、异常、文件等通用功能类。数据结构提供了双向链表、栈、队列、堆、优先队列、固定大小数组、对象存储器, 但效率是否高于数组实现需要在应用内具体测试,方才测试队列类的效能发现低于原生实现, 不过固定数组的效率还是很可观的,下面代码是对固定大小数组的一个测试, 速度快了近 1 倍,详细代码如下:SplFixedArray 数组运行时间与内存使用大小:Run

19、ning time:0.2420928478241Memory usage:52324152Array 数组运行时间与内存使用大小:Running time:0.42152786254883Memory usage:10051799211.延迟静态绑定。12.循环垃圾收集, 能够发现对象的循环引用并自动回收内存13.支持 phar 归档不兼容的特性:1.atsort,natcasesort,usort,uasort,array_flip 等数组函数不支持传入对象。2.魔术方法必须声明为公共属性3.从 PECL 移除的库, ncurses, fpdf, dbase, fbsql, ming.4.废弃的 tick, ereg 正则。5.namespace,Closure 变成了保留值6.http Stream 流支持 200-399 全部状态7.去除了 magic quotes 和 register globals 特性8.出错提示信息与 5.2 版本相比有变化9.以下配置项在 PHP5.3 将产生警告define_syslog_variablesregister_globalsregister_long_arrayssafe_modemagic_quotes_gpcmagic_quotes_runtimemagic_quotes_sybase

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报