$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";