PHP性能分析工具XHProf深入分析
发布:smiling 来源: PHP粉丝网 添加日期:2018-10-31 22:51:02 浏览: 评论:0
多次调用xhprof_enable方法,最后生效的配置是哪个?
当你在一次请求中多次调用xhprof_enable方法,只有第一次调用时进行的设置能生效。在调用.
xhprof_disable()后,你又可以使用xhprof_enable方法进行设置。
- $i = 0;
- function good(){
- global $i;
- $i++;
- if ($i < 2) {
- good();
- }
- }
- function func() {
- good();
- }
- $start_time = microtime(true);
- xhprof_enable(XHPROF_FLAGS_NO_BUILTINS);
- xhprof_enable(XHPROF_FLAGS_MEMORY + XHPROF_FLAGS_CPU + XHPROF_FLAGS_NO_BUILTINS);
- for ($i = 0; $i < 100; $i++) {
- func();
- }
- good();
- $rst = xhprof_disable();
- var_dump($rst);
输出内容为:
- array(5) {
- ["good==>good@1"]=>
- array(2) {
- ["ct"]=>
- int(1)
- ["wt"]=>
- int(70)
- }
- ["func==>good"]=>
- array(2) {
- ["ct"]=>
- int(50)
- ["wt"]=>
- int(121)
- }
- ["main()==>func"]=>
- array(2) {
- ["ct"]=>
- int(50)
- ["wt"]=>
- int(135)
- }
- ["main()==>good"]=>
- array(2) {
- ["ct"]=>
- int(1)
- ["wt"]=>
- int(0)
- }
- ["main()"]=>
- array(2) {
- ["ct"]=>
- int(1)
- ["wt"]=>
- int(237)
- }
- }
可见,打印的内容,并没有cpu和memory的信息。
输出内容中的ct,wt,cpu,mu, pmu 都代表什么意思.
ct 表示 调用的次数
wt 表示 函数方法执行的时间耗时。相当于,在调用前记录一个时间,函数方法调用完毕后,计算时间差。
cpu 表示 函数方法执行消耗的cpu时间。和wt的差别在于,当进程让出cpu使用权后,将不再计算cpu时间。通过调用系统调用getrusage获取进程的占用cpu数据。
mu 表示 函数方法所使用的内存。相当于,在调用前记录一个内存占用,函数方法调用完毕后,计算内存差。调用的是zend_memory_usage获取内存占用情况。
pmu 表示 函数方法所使用的内存峰值。调用的是zend_memory_peak_usage获取内存情况。
输出内容中good==>good@1 是什么意思
==>表示一个调用关系。由于带@,说明是一个递归调用。@后面的数字是递归调用的深度。
如何设置xhprof_enable的参数,减少性能消耗
xhprof_enable提供了三个常量,用于设置你是否需要统计PHP内置函数,都统计那些指标。
三个常量如下:
XHPROF_FLAGS_NO_BUILTINS
设置这个常量后,将不统计PHP内置函数。毕竟PHP的内置函数性能一般都不错。没必要再消耗性能去统计。所以,建议设置。
XHPROF_FLAGS_CPU
设置这个常量后,会统计进程占用CPU时间。由于CPU时间是通过调用系统调用getrusage获取,导致性能比较差。开启这个选项后,大概性能下降一半。因此,如果对cpu耗时不是特别敏感的情况下,建议不要启用这个选项。
XHPROF_FLAGS_MEMORY
设置这个常量后,将会统计内存占用情况。由于获取内存情况,使用的是zend_memory_usage和zend_memory_peak_usage,并不是系统调用。因此,对性能影响不大。如果需要对内存使用情况进行分析的情况下,可以开启。
性能分析原理
如何实现对各个函数方法性能数据记录
目前xhprof会对,加载PHP文件,执行PHP函数方法,和执行eval方法进行性能数据记录。正好,这些在PHP内核中,有对应的函数进行处理。当你调用xhprof_enable方法时,会把默认的方法替换为xhprof的方法。来看看相关代码吧。
- static void hp_begin(long level, long xhprof_flags)
- {
- if (!hp_globals.enabled)
- {
- int hp_profile_flag = 1;
- hp_globals.enabled = 1;
- hp_globals.xhprof_flags = (uint32) xhprof_flags;
- /* Replace zend_compile with our proxy */
- /* 处理加载PHP文件 */
- /* 先把zend引擎默认处理方法保存到_zend_compile_file变量中。*/
- _zend_compile_file = zend_compile_file;
- /* 在把xhprof相对应的方法赋值给zend_compile_file。
- 这样,每次加载PHP文件时,就会执行xhprof相应的方法。*/
- zend_compile_file = hp_compile_file;
- /* Replace zend_compile_string with our proxy */
- /* 处理eval代码的执行 */
- _zend_compile_string = zend_compile_string;
- zend_compile_string = hp_compile_string;
- /*init the execute pointer*/
- /* 处理 函数方法的执行 */
- _zend_execute_ex = zend_execute_ex;
- zend_execute_ex = hp_execute_ex;
- .........
- }
- }
- /*那我们看下,hp_compile_file方法,又是如何实现的*/
- ZEND_DLEXPORT zend_op_array* hp_compile_file(zend_file_handle *file_handle, int type)
- {
- const char *filename;
- char *func;
- int len;
- zend_op_array *ret;
- int hp_profile_flag = 1;
- filename = hp_get_base_filename(file_handle->filename);
- len = sizeof("load") - 1 + strlen(filename) + 3;
- func = (char *) emalloc(len);
- snprintf(func, len, "load::%s", filename);
- //方法执行前记录当前各项性能如数,如cpu 内存等
- BEGIN_PROFILING(&hp_globals.entries, func, hp_profile_flag);
- //开始zend引擎相应的方法,加载文件
- ret = _zend_compile_file(file_handle, type);
- if (hp_globals.entries)
- {
- //加载文件完毕后,再次记录当前各项性能数据。以便以后计算差值。
- END_PROFILING(&hp_globals.entries, hp_profile_flag);
- } //phpfensi.com
- efree(func);
- return ret;
- }
xhprof在实现的时候,性能方面做了哪些优化
获取时间时,为了性能,使用了汇编来获取时间戳计数器。时间秒 = 时间戳计数器值 / CPU主频。
正是这种实现,导致目前xhprof还只适用于x86架构。此外,因为RDTSC的数据不能在CPU间同步,所以,xhprof会将进程绑定在单个CPU上。
如果SpeedStep技术是打开的,XHProf的基于RDTSC定时器的功能就不能正常工作了。这项技术在某些英特尔处理器上是可用的。[注:苹果台式机和笔记本电脑一般都将SpeedStep技术预设开启。使用XHProf,您需要禁用SpeedStep技术。 ]
- inline uint64 cycle_timer()
- {
- uint32 __a, __d;
- uint64 val;
- asm volatile("rdtsc" : "=a" (__a), "=d" (__d));
- (val) = ((uint64) __a) | (((uint64) __d) << 32);
- return val;
- }
Tags: PHP性能分析 XHProf
相关文章
- ·php性能分析之php-fpm的慢执行日志slow log(2015-05-09)
- ·使用xhprof在开发环境中测试php性能(2015-04-04)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)