基于 xhprof 对 Laravel6 进行性能分析
基于 xhprof 的性能分析
XHProf 是一个函数层级的性能分析工具,并提供一个简单的基于 HTML 的报告展示页面。
项目地址:github.com/phacility/xhprof
扩展地址:pecl.php.net/package/xhprof
安装扩展
Pecl 安装
$ wget http://pecl.php.net/get/xhprof-2.2.0.tgz
$ pecl install xhprof-2.2.0.tgz
编译安装
# 到 Github 下载指定版本的扩展源码
$ cd xhprof-src
$ phpize
$ ./configure
$ make && make install
检查安装结果
$ php -m | grep xhprof
xhprof
对 Laravel 框架进行性能分析
首先准备一份Laravel6
项目代码:
composer create-project --prefer-dist laravel/laravel laravel-xhprof-test v6.0.2
对下载的压缩包 xhprof-2.2.0.tgz
进行解压,并拷贝到项目根目录下,分析结果需要用此库进行保存。
编辑项目入口文件 public/index.php
添加:
// 开启分析
xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);
$app = require_once __DIR__.'/../bootstrap/app.php';
// ...
$kernel->terminate($request, $response);
// 结束分析
$xhprof_data = xhprof_disable();
// 保存结果
$XHPROF_ROOT = base_path('/xhprof-2.2.0/xhprof-2.2.0/');
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";
$xhprof_runs = new XHProfRuns_Default();
// 保存分析结果,默认存储在 `sys_get_temp_dir()` 目录中
$xhprof_runs->save_run($xhprof_data, "xhprof_laravel_testing");
启动 Laravel Server 服务
$ php artisan serve
Laravel development server started: http://127.0.0.1:8000
查看分析接口
$ cd xhprof-2.2.0/xhprof-2.2.0
$ php -S localhost:8001
PHP 7.2.25 Development Server started at Fri Aug 14 14:56:40 2020
Listening on http://localhost:8001
Document root is /Users/helingfeng/laravel-xhprof-test/xhprof-2.2.0/xhprof-2.2.0
Press Ctrl-C to quit.
开启 Laravel 配置和路由缓存,对比性能分析结果
什么都不做,直接访问页面
# 不开启缓存分析结果
Overall Summary
Total Incl. Wall Time (microsec): 69,918 microsecs
Total Incl. CPU (microsecs): 68,252 microsecs
Total Incl. MemUse (bytes): 4,459,944 bytes
Total Incl. PeakMemUse (bytes): 4,461,968 bytes
Number of Function Calls: 22,285
开启配置缓存,路由缓存
$ php artisan config:cache
$ php artisan route:cache
# 开启缓存分析结果
Overall Summary
Total Incl. Wall Time (microsec): 44,372 microsecs
Total Incl. CPU (microsecs): 43,643 microsecs
Total Incl. MemUse (bytes): 4,101,176 bytes
Total Incl. PeakMemUse (bytes): 4,153,032 bytes
Number of Function Calls: 13,993
对比两次结果,可以发现还是有比较大的差距的,Total Incl. CPU (microsecs)
从 68ms 下降到 43ms 。Number of Function Calls
函数调用次数从 22,285 下降到 13,993
指标含义:
- Calls:方法被调用的次数。
- Calls%:方法调用次数在同级方法总数调用次数中所占的百分比。
- Incl.Wall Time(microsec):方法执行花费的时间,包括子方法的执行时间。(单位:微秒)
- IWall%:方法执行花费的时间百分比。
- Excl. Wall Time(microsec):方法本身执行花费的时间,不包括子方法的执行时间。(单位:微秒)
- EWall%:方法本身执行花费的时间百分比。
- Incl. CPU(microsecs):方法执行花费的CPU时间,包括子方法的执行时间。(单位:微秒)
- ICpu%:方法执行花费的CPU时间百分比。
- Excl. CPU(microsec):方法本身执行花费的CPU时间,不包括子方法的执行时间。(单位:微秒)
- ECPU%:方法本身执行花费的CPU时间百分比。
- Incl.MemUse(bytes):方法执行占用的内存,包括子方法执行占用的内存。(单位:字节)
- IMemUse%:方法执行占用的内存百分比。
- Excl.MemUse(bytes):方法本身执行占用的内存,不包括子方法执行占用的内存。(单位:字节)
- EMemUse%:方法本身执行占用的内存百分比。
- Incl.PeakMemUse(bytes):Incl.MemUse峰值。(单位:字节)
- IPeakMemUse%:Incl.MemUse峰值百分比。
- Excl.PeakMemUse(bytes):Excl.MemUse峰值。单位:(字节)
- EPeakMemUse%:Excl.MemUse峰值百分比。
本作品采用《CC 协议》,转载必须注明作者和本文链接