PHP 效能的微觀分析

來源:互聯網
上載者:User
一、效能分析相關的函數與命令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 中,記憶體使用量如下: 
    [root@localhostphpperf]# php52 memory.php    0: 93784 bytes    10000: 93784 bytes    ……    80000: 93784 bytes    90000: 93784 bytes    peak: 262144 bytes
PHP 5.3 中,記憶體使用量如下
    [root@localhostphpperf]# 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 差不多,有所最佳化:    
 [root@localhostphpperf]# php56 memory.php    0: 224944 bytes    10000: 224920 bytes    ……    80000: 224920 bytes    90000: 224920 bytes    peak: 262144 bytes
而 PHP 7 在少量使用時,高峰記憶體的使用,增大很多。   
  [root@localhostphpperf]# 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";

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.