国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

PHP性能分析工具XHProf深入分析

2024-05-04 21:50:40
字體:
來源:轉載
供稿:網友

多次調用xhprof_enable方法,最后生效的配置是哪個?

當你在一次請求中多次調用xhprof_enable方法,只有第一次調用時進行的設置能生效。在調用.

xhprof_disable()后,你又可以使用xhprof_enable方法進行設置。

  1. $i = 0; 
  2. function good(){ 
  3.     global $i
  4.     $i++; 
  5.     if ($i < 2) { 
  6.         good(); 
  7.     } 
  8. function func() { 
  9.     good(); 
  10. $start_time = microtime(true); 
  11. xhprof_enable(XHPROF_FLAGS_NO_BUILTINS); 
  12. xhprof_enable(XHPROF_FLAGS_MEMORY + XHPROF_FLAGS_CPU + XHPROF_FLAGS_NO_BUILTINS); 
  13. for ($i = 0; $i < 100; $i++) { 
  14.     func(); 
  15. good(); 
  16. $rst = xhprof_disable(); 
  17. var_dump($rst); 

輸出內容為:

  1. array(5) { 
  2.   ["good==>good@1"]=> 
  3.   array(2) { 
  4.     ["ct"]=> 
  5.     int(1) 
  6.     ["wt"]=> 
  7.     int(70) 
  8.   } 
  9.   ["func==>good"]=> 
  10.   array(2) { 
  11.     ["ct"]=> 
  12.     int(50) 
  13.     ["wt"]=> 
  14.     int(121) 
  15.   } 
  16.   ["main()==>func"]=> 
  17.   array(2) { 
  18.     ["ct"]=> 
  19.     int(50) 
  20.     ["wt"]=> 
  21.     int(135) 
  22.   } 
  23.   ["main()==>good"]=> 
  24.   array(2) { 
  25.     ["ct"]=> 
  26.     int(1) 
  27.     ["wt"]=> 
  28.     int(0) 
  29.   } 
  30.   ["main()"]=> 
  31.   array(2) { 
  32.     ["ct"]=> 
  33.     int(1) 
  34.     ["wt"]=> 
  35.     int(237) 
  36.   } 

可見,打印的內容,并沒有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的方法。來看看相關代碼吧。

  1. static void hp_begin(long level, long xhprof_flags) 
  2.     if (!hp_globals.enabled) 
  3.     { 
  4.         int hp_profile_flag = 1; 
  5.  
  6.         hp_globals.enabled = 1; 
  7.         hp_globals.xhprof_flags = (uint32) xhprof_flags; 
  8.  
  9.          /* Replace zend_compile with our proxy */ 
  10.                  /* 處理加載PHP文件 */ 
  11.                  /* 先把zend引擎默認處理方法保存到_zend_compile_file變量中。*/ 
  12.         _zend_compile_file = zend_compile_file; 
  13.                 /* 在把xhprof相對應的方法賦值給zend_compile_file。 
  14.                    這樣,每次加載PHP文件時,就會執行xhprof相應的方法。*/ 
  15.         zend_compile_file  = hp_compile_file; 
  16.  
  17.         /* Replace zend_compile_string with our proxy */ 
  18.                 /* 處理eval代碼的執行 */ 
  19.         _zend_compile_string = zend_compile_string; 
  20.         zend_compile_string  = hp_compile_string; 
  21.  
  22.         /*init the execute pointer*/ 
  23.                 /* 處理 函數方法的執行 */ 
  24.         _zend_execute_ex = zend_execute_ex; 
  25.         zend_execute_ex  = hp_execute_ex; 
  26.               ......... 
  27.     } 
  28.  
  29. /*那我們看下,hp_compile_file方法,又是如何實現的*/ 
  30. ZEND_DLEXPORT zend_op_array* hp_compile_file(zend_file_handle *file_handle, int type) 
  31.     const char *filename; 
  32.     char *func; 
  33.     int len; 
  34.     zend_op_array *ret; 
  35.     int hp_profile_flag = 1; 
  36.  
  37.     filename = hp_get_base_filename(file_handle->filename); 
  38.     len = sizeof("load") - 1 + strlen(filename) + 3; 
  39.     func = (char *) emalloc(len); 
  40.     snprintf(func, len, "load::%s", filename); 
  41.  
  42.         //方法執行前記錄當前各項性能如數,如cpu 內存等 
  43.     BEGIN_PROFILING(&hp_globals.entries, func, hp_profile_flag); 
  44.         //開始zend引擎相應的方法,加載文件 
  45.     ret = _zend_compile_file(file_handle, type); 
  46.     if (hp_globals.entries) 
  47.     { 
  48.                 //加載文件完畢后,再次記錄當前各項性能數據。以便以后計算差值。 
  49.         END_PROFILING(&hp_globals.entries, hp_profile_flag); 
  50.     } //Vevb.com 
  51.  
  52.     efree(func); 
  53.     return ret; 

xhprof在實現的時候,性能方面做了哪些優化

獲取時間時,為了性能,使用了匯編來獲取時間戳計數器。時間秒 = 時間戳計數器值 / CPU主頻。

正是這種實現,導致目前xhprof還只適用于x86架構。此外,因為RDTSC的數據不能在CPU間同步,所以,xhprof會將進程綁定在單個CPU上。

如果SpeedStep技術是打開的,XHProf的基于RDTSC定時器的功能就不能正常工作了。這項技術在某些英特爾處理器上是可用的。[注:蘋果臺式機和筆記本電腦一般都將SpeedStep技術預設開啟。使用XHProf,您需要禁用SpeedStep技術。 ]

  1. inline uint64 cycle_timer() 
  2.     uint32 __a, __d; 
  3.     uint64 val; 
  4.     asm volatile("rdtsc" : "=a" (__a), "=d" (__d)); 
  5.     (val) = ((uint64) __a) | (((uint64) __d) << 32); 
  6.     return val; 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 视频| 江安县| 商都县| 灵石县| 沈丘县| 盐津县| 德保县| 怀安县| 增城市| 楚雄市| 洱源县| 任丘市| 峨山| 安国市| 牙克石市| 泰顺县| 资中县| 泸水县| 晋州市| 南江县| 汪清县| 合水县| 东至县| 西乌| 嘉兴市| 西华县| 常德市| 丽江市| 舟曲县| 延安市| 和平区| 武平县| 永修县| 丁青县| 昭觉县| 石家庄市| SHOW| 金门县| 肇庆市| 蛟河市| 广昌县|