• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP 性能的微观分析_php

php 搞代码 3年前 (2018-06-21) 66次浏览 已收录 0个评论

一、性能分析相关的函数与命令

1.1、时间度量函数
平时我们常用 time() 函数,但是返回的是秒数,对于某段代码的内部性能分析,到秒的精度是不够的。于是要用 microtime 函数。而 microtime 函数可以返回两种形式,一是字符串的形式,一是浮点数的形式。不过需要注意的是,在缺省的情况下,返回的精度只有4位小数。为了获得更高的精确度,我们需要配置 precision。
 
如下是 microtime 的使用结果。
 
     $start= microtime(true);     echo $start."/n";     $end = microtime(true);     echo $end."/n";     echo ($end-$start)."/n";

输出为:
 
    bash-3.2# phptime.php
 
    1441360050.3286
    1441360050.3292
    0.00053000450134277
而在代码前面加上一行:
 
    ini_set("precision", 16);
输出为:
 
    bash-3.2# phptime.php
 
    1441360210.932628
    1441360210.932831
    0.0002031326293945312
除了 microtime 内部统计之外, 还可以使用 getrusage 来取得用户态的事长。在实际的操作中,也常用 time 命令来计算整个程序的运行时长,通过多次运行或者修改代码后运行,得到不同的时间长度以得到效率上的区别。 具体用法是:time phptime.php ,则在程序运行完成之后,不管是否正常结束退出,都会有相关的统计。
 
    bash-3.2# time phptime.php
 
    1441360373.150756
    1441360373.150959
    0.0002031326293945312
 
    real    0m0.186s
    user    0m0.072s
    sys     0m0.077s
因为本文所讨论的性能问题,往往分析上百万次调用之后的差距与趋势,为了避免代码中存在一些时间统计代码,后面我们使用 time 命令居多。
 
1.2、内存使用相关函数
分析内存使用的函数有两个:memory_ get_ usage、memory_ get_ peak_usage,前者可以获得程序在调用的时间点,即当前所使用的内存,后者可以获得到目前为止高峰时期所使用的内存。所使用的内存以字节为单位。
     $base_memory= memory_get_usage();     echo "Hello,world!/n";     $end_memory= memory_get_usage();     $peak_memory= memory_get_peak_usage();      echo $base_memory,"/t",$end_memory,"/t",($end_memory-$base_memory),"/t", $peak_memory,"/n";

输出如下:
 
    bash-3.2# phphelloworld.php
 
    Hello,world!
    224400  224568  168     227424
可以看到,即使程序中间只输出了一句话,再加上变量存储,也消耗了168个字节的内存。
 
对于同一程序,不同 PHP 版本对内存的使用并不相同,甚至还差别很大。
 
 

    $baseMemory= memory_get_usage();     class User     {     private $uid;     function __construct($uid)         {     $this->uid= $uid;         }     }          for($i=0;$i<100000;$i++)     {     $obj= new User($i);     if ( $i% 10000 === 0 )         {     echo sprintf( '%6d: ', $i), memory_get_usage(), " bytes/n";         }     }     echo "  peak: ",memory_get_peak_usage(true), " bytes/n";

在 PHP 5.2 中,内存使用如下:
 
     [[email protected]]# php52 memory.php       0: 93784 bytes     10000: 93784 bytes     ……     80000: 93784 bytes     90000: 93784 bytes     peak: 262144 bytes

PHP 5.3 中,内存使用如下
     [[email protected]]# phpmemory.php       0: 634992 bytes     10000: 634992 bytes     ……     80000: 634992 bytes     90000: 634992 bytes     peak: 786432 bytes

可见 PHP 5.3 在内存使用上要粗放了一些。
 
PHP 5.4 – 5.6 差不多,有所优化:
 
   

  [[email protected]]# php56 memory.php       0: 224944 bytes     10000: 224920 bytes     ……     80000: 224920 bytes     90000: 224920 bytes     peak: 262144 bytes

而 PHP 7 在少量使用时,高峰内存的使用,增大很多。
 
  

   [[email protected]]# php7 memory.php       0: 353912 bytes     10000: 353912 bytes     ……     80000: 353912 bytes     90000: 353912 bytes     peak: 2097152 bytes

从上面也看到,以上所使用的 PHP 都有比较好的垃圾回收机制,10万次初始化,并没有随着对象初始化的增多而增加内存的使用。PHP7 的高峰内存使用最多,达到了接近 2M。
 
下面再来看一个例子,在上面的代码的基础上,我们加上一行,即如下加粗的一行:
 
    $obj->self = $obj;
代码如下:
     $baseMemory= memory_get_usage();     class User     {     private $uid;     function __construct($uid)         {     $this->uid= $uid;         }     }          for($i=0;$i<100000;$i++)     {     $obj= new User($i);     $obj->self = $obj;     if ( $i% 5000 === 0 )         {     echo sprintf( '%6d: ', $i), memory_get_usage(), " bytes/n";         }     }

    echo "  peak: ",memory_get_peak_usage(true), " bytes/n";

欢迎大家阅读《PHP 性能的微观分析_php》,跪求各位点评,若觉得好的话请收藏本文,by 搞代码


喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址