> php教程 > php手册 > PHP 性能的微观分析

PHP 性能的微观分析

WBOY
풀어 주다: 2016-06-13 08:54:37
원래의
1108명이 탐색했습니다.

PHP 性能的微观分析

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

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( &#39;%6d: &#39;, $i), memory_get_usage(), " bytes\n";
        }
    }
    echo "  peak: ",memory_get_peak_usage(true), " bytes\n";
로그인 후 복사

在 PHP 5.2 中,内存使用如下:

    [root@localhostphpperf]# php52 memory.php


    0: 93784 bytes
    10000: 93784 bytes
    &hellip;&hellip;
    80000: 93784 bytes
    90000: 93784 bytes
    peak: 262144 bytes
로그인 후 복사

PHP 5.3 中,内存使用如下

    [root@localhostphpperf]# phpmemory.php


    0: 634992 bytes
    10000: 634992 bytes
    &hellip;&hellip;
    80000: 634992 bytes
    90000: 634992 bytes
    peak: 786432 bytes
로그인 후 복사

可见 PHP 5.3 在内存使用上要粗放了一些。

PHP 5.4 - 5.6 差不多,有所优化:

 [root@localhostphpperf]# php56 memory.php


    0: 224944 bytes
    10000: 224920 bytes
    &hellip;&hellip;
    80000: 224920 bytes
    90000: 224920 bytes
    peak: 262144 bytes
로그인 후 복사

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

  [root@localhostphpperf]# php7 memory.php


    0: 353912 bytes
    10000: 353912 bytes
    &hellip;&hellip;
    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( &#39;%6d: &#39;, $i), memory_get_usage(), " bytes\n";
        }
    }
로그인 후 복사

 

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

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 추천
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿