程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP 性能的微觀分析

PHP 性能的微觀分析

編輯:關於PHP編程

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( '%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";

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved