PHP性能分析工具XHProf深入解析
发布时间:2022-02-24 13:36 所属栏目:121 来源:互联网
导读:多次调用xhprof_enable方法,最后生效的配置是哪个? 当你在一次请求中多次调用xhprof_enable方法,只有第一次调用时进行的设置能生效。在调用. xhprof_disable()后,你又可以使用xhprof_enable方法进行设置。 $i = 0; function good(){ global $i; $i++; if
多次调用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 表示 函数方法执行的时间耗时。相当于,在调用前记录一个时间,函数方法调用完毕后,计算时间差。 输出内容中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; ......... } } //方法执行前记录当前各项性能如数,如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); } //Cuoxin.com efree(func); return ret; } xhprof在实现的时候,性能方面做了哪些优化 如果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; } (编辑:ASP站长网) |
相关内容
网友评论
推荐文章
热点阅读