XHProf是一個輕量級PHP性能分析工具,類似 xdebug,但比 xdebug 分析的資訊更加詳細, 包括函數的調用次數,花費的時間(自身花費時間和包含内部函數花費的時間),所占記憶體/CPU,所占記憶體的峰值及所占百分比 等 等 xhprof_lib/display/xhprof.php Incl. User (microsecs) Incl. Sys (microsec)
, 為什麼用的是
呢,因為源碼包中
檔案裡還有一個
和
沒有在結果中顯示,有興趣的同學可以研究研究。
安裝
$ wget https://github.com/facebook/xhprof/tarball/master -O xhprof.tar.gz$ tar zxf xhprof.tar.gz
$ cd facebook-xhprof-b8c76ac/extension/# phpize# ./configure --with-php-config=`/path/to/php-config`# make && make install# make test# vi /etc/php.d/xhprof.ini; 内容為:extension = xhprof.so; 注意:output_dir 必須存在且可寫xhprof.output_dir = /tmp/xhprof# service php-fpm restart 或 service httpd restart
當然也可以使用
yum install php-pecl-xhprof
安裝, 但是源碼包中
xhprof_html
和
xhprof_lib
這兩個檔案夾是需要的,見 使用 web 界面。
簡單使用
現在運作下例子看下效果:
$ php -f facebook-xhprof-b8c76ac/examples/sample.php
輸出結果略。
輸出結果中的含義:
ct 函數調用次數,wt 花費的時間,cpu 花費的 CPU 時間(微秒即百萬分之一秒),mu 使用的記憶體(bytes),pmu 使用的記憶體峰值(bytes)。
xhprof_enable 參數
還可以給
xhprof_enable()
傳入:
XHPROF_FLAGS_CPU 分析結果中添加 CPU 資料XHPROF_FLAGS_MEMORY 分析結果中添加記憶體資料XHPROF_FLAGS_NO_BUILTINS 跳過 PHP 内置函數
三個參數中的一個或多個,類似這樣:
xhprof_enable(XHPROF_FLAGS_NO_BUILTINS);xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);xhprof_enable(XHPROF_FLAGS_NO_BUILTINS | XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);
使用 web 界面
但這樣的輸出結果在程式較大時對于我們沒有實際意義, 在
xhprof 源碼包
中提供了
xhprof_html
xhprof_lib
兩個檔案夾是使用 PHP 開發,用于顯示 xhprof 分析結果的 web 界面, 比上例輸出結果更加詳細易讀。
$ mkdir /var/www/html/xhprof
$ mv xhprof_html/ xhprof_lib/ examples/ /var/www/html/xhprof/$ cd /var/www/html/$ vi xhprof/examples/sample.php将 `<xhprof-ui-address>` 替換為 `localhost/xhprof/xhprof_html`
/var/www/html
為
DOCUMENT_ROOT
目錄。
測試一下,浏覽器運作:
http://localhost/xhprof/examples/sample.php
而浏覽器輸出的内容最後有一個類似這樣的連結位址:
http://localhost/xhprof/xhprof_html/index.php?run=50ec187a72aa9&source=xhprof_foo
/tmp/xhprof
目錄下會多出一個類似于
50ec187a72aa9.xhprof_foo.xhprof
的檔案, 此檔案用于存儲 xhprof 分析結果的資料資訊,作為上述 url 位址的資料來源。
打開這個連結即是 xhprof 的 web 分析結果頁面。 這個頁面提供了:
Calls:函數的調用次數Incl. Wall Time (microsec) :包含内部函數花費的時間,機關微秒Excl. Wall Time (microsec):不包含内部函數花費的時間,機關微秒及所占百分比(%)注:Incl.:為 Including 包含的簡寫Excl.:為 Excluding 不包含的簡寫Wall Time:意為挂鐘時間即任務花費的時間
根據此結果頁簡單解釋下
Function Name
列:
main():一個虛構的函數,程式根節點bar@2:遞歸調用 2 次
另外
load::filename
run_init::filename
是跟蹤 PHP 的
include/require
操作。
在此結果中
strlen
xhprof_disable
為 PHP 内置函數,如果我們想跳過内置函數不作分析, 并且統計 CPU 和記憶體使用資訊怎麼辦呢,上面提到過 xhprof_enable 參數, 修改
xhprof/examples/sample.php
檔案看一下:
将 xhprof_enable(); 行,替換為xhprof_enable(XHPROF_FLAGS_NO_BUILTINS | XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);
重新整理下頁面,再次打開頁面最後的 url,這次提供的資訊就十分詳細了。
Incl. CPU (microsecs):包含内部函數 CPU 花費的時間,機關微秒Excl. CPU (microsec):不包含内部函數 CPU 花費的時間,機關微秒Incl. MemUse (bytes):包含内部函數所占記憶體,機關位元組Excl. MemUse (bytes):不包含内部函數所占記憶體,機關位元組Incl. PeakMemUse (bytes):包含内部函數所占記憶體峰值,機關位元組Excl. PeakMemUse (bytes):不包含内部函數所占記憶體峰值,機關位元組及所占百分比(%)可以認為共三種情況:1. 包括内部函數2. 不包括内部函數或者說函數本身3. 所占總數(時間或記憶體使用)的百分比
peak
意為峰值,
這裡的 CPU 花費時間為什麼是 0 呢
, 再修改下
xhprof/examples/sample.php
将 foo() 函數中的 for 循環條件 $idx < 5 改為 50
再看一下 web 分析頁面結果,CPU 時間出來了。
安裝 graphviz
分析結果頁中有一個挺明顯的
View Full Callgraph
連結, 這個連結是檢視整個程式的函數調用流程。使用 graphviz 生成。
# yum install graphviz
編譯安裝請注意先安裝
libpng
依賴。
參考
net tuts+:http://net.tutsplus.com/tutorials/php/advanced-codeigniter-profiling-with-xhprof/源碼包中的:xhprof_html/docs/index.html
http://www.162cm.com/p/xhprofdoc.html
轉載請注明出處。
本文位址:http://blog.aboutc.net/php/17/php-profiler-xhprof
- 目錄
- 導言
- XHProf概況
- 術語表
- 特殊函數的命名約定
- 限制
- 安裝XHProf擴充
- 使用XHProf來做性能分析
- 設定XHProf使用者界面
- 在生産環境中使用XHProf的注意 事 項
- 輕量級采樣模式
- 附加功能
- 依賴性
- 鳴謝
作者這樣介紹自己:
翻譯:徐仁祿 <xurenlu [at] gmail.com >
原文位址:
初次翻譯,大部分是google translate tookit工具給翻的,稍微修改了下。如遇錯誤,還請來信指出。謝謝!
内容如下:
- XHProf 概況
- 使用XHProf進行性 能分析
- 設 置XHProf使用者界面
- 在生産環境中使用 XHProf注意事項
- 附加功 能
- 信賴
- 鳴 謝
-
XHProf是一個分層PHP性能分析工具。它報告函數級别的請求次數和各種名額,包括阻塞時間,CPU時間和記憶體使用情 況。一個函數的開銷,可細分成調用者和被調用者的開銷。原始資料收集部分是用純C實作的,是一個名叫xhprof的 Zend擴充 。XHProf有一個簡單的HTML的使用者界面( PHP寫成的)。基于浏覽器的性能分析使用者界面能更容易檢視,或是與同行們分享成果。也能繪制調用關系圖。
XHProf報告往往可以有助于了解被執行的代碼的結構。的等級性質的報告可用來确定,例如,什麼鍊要求導緻了所謂的特殊 功能得到。
XHProf可以比較兩次運作的結果(又名“差異報告”)或是從多次運作得到的彙總資料。差異和彙總報告,就像單一運作報 告一樣,也提供“平闆”以及“分層”的性能分析視圖。
XHProf是一種輕量級的性能分析工具。在資料收集階段,它記錄調用次數的追蹤和包容性的名額弧在動态 callgraph的一個程式。它獨有的資料計算的報告/後處理階段。在資料收集時,XHProfd通過檢測循環來處理遞歸的函數調用,并通過給遞歸調用 中每個深度的調用一個有用的命名來避開死循環。
XHProf的輕量級性質和彙聚功能,使得它非常适合用于收集“生産環境”的性能統計資料的統計。[見用于生産環境的補充 說明。 ]
例如,XHProfLive (不屬于開源的工具包),是Facebook使用的一個全系統的性能監測系統,建立在XHProf的基礎之上 。 XHProfLive不斷收集函數級别的Profiler資料,這些資料來自生産環境中運作中的示例頁面[用xhprof來收集] 。然後XHProfLive彙總指定的時候,頁面類型,來取得各個頁面的性能資料,可以幫助解決各種問題,如:特定的某個網頁的函數級的性能情況怎樣?在 所有網頁中,或者對某一具體的網頁,foo 函數的開銷如何?在過去的一小時/天/周中,哪些函數傳回的次數最多?某個頁面/函數的執行時間的變化趨勢如何?等等。
由Facebook最初開發的XHProf在2009年3月開放源代碼。
-
- load::lib/common.php - 核心加載和編譯檔案的工作。[注:如果您使用的了PHP的opcode 緩存比如APC之類的,隻有當緩存失效時才會去編譯。
- run_init::lib/common.php -由于包含操作引起的初始化操作等。
- 哪些函數調用了指定的函數,各自調了多少次?
- 一個特定的函數調用了哪些函數?
- 在被一個特定的函數調用時,某個函數一共耗去了多少時間 。
-
扁平的性能概要(截 圖 )
提供函數級别的性能資訊,例如調用次數,其中包括/獨家壁時間,記憶體使用情況,和CPU時間。
-
分層剖析(父/子{0視圖){/0} ( 截 圖 )
對每一個函數,它提供了一個斷點,個崩潰的要求和時間每母公司(來電)和兒童(被調用) ,如:
-
差異報告
出于各種原因,您可能需要比較從兩個XHProf運作中得到的資料-找出是什麼造成了從一個版本到另一個版本的退 步,或是評估您将要做的優化的性能提升。
阿差異報告考慮兩分,作為輸入,并提供兩個平面功能級别差異的資訊,和層次資訊(細目差異的父母/兒童職能)的每 個功能。
差異報告裡的“平闆”視圖指出了最主要的退步或改進。
點選差異報告平闆視圖中的函數,進入“層次”(或父/子)視圖。我們可以得到的具體的父子函數的差異。
-
Callgraph視圖
性能資料也可以通過callgraph視圖來檢視 。callgraph 會高亮顯示程式的關鍵路徑。
-
記憶體剖析
XHProf的記憶體剖析模式能有助于跟蹤那些申請大量記憶體的函數。
值得澄清的是,XHProfu并不嚴格跟蹤所有配置設定/釋放記憶體的操作。相反,它使用了一種簡化思路。他記錄了每個 函數進入和結束後的記憶體的增減。它還記錄每個函數配置設定記憶體的峰值的變化。
- XHProf記錄include, include_once, require and require_once require_once操作,就像他們是函數一樣。那些被包含檔案的名字被用來産生假的函數的名字。
-
-
-
真正的層次剖析器會在每一個資料采集點記錄完全的調用堆棧。接下來,能夠回答這些問題,如:第三次foo()調用 的開銷是多少?或是當調用棧是a()->b()->bar()時bar()函數的開銷是多少?
XHProf隻記錄一級的調用上下文,是以隻能回答關于一級一級函數調用的問題。事實證明,在實踐中這是最主要的 利用情況。
為了使這個更具體,看看下面的例子。
假設你有: 1 call from a() --> c() 1 call from b() --> c() 50 calls from c() --> d()
雖然XHProf可以告訴你, d()被c()調用了50次,卻不能告訴你,有多少次分别是由a()和b()引起的。[我們可以推測,也許有25次是因為a(),有25次是由于b(), 但未必如此。 ]
然而在實踐中,這沒什麼大不了。
- main():一個虛構的函數,這是所有調用的根節點。
-
load::<filename> 和 run_init::<filename>:
XHProf 跟蹤PHP的include/require操作,和跟蹤函數調用一樣。
例如, include “lib/common.php"; 操作看起來像調了兩個XHProf函數:
- foo@<n> :意味着這是一個foo()函數的遞歸調用。<n>代表遞歸深度。遞歸可能是直接的,(比如由于foo() --> foo() ) ,也可能是間接的(如由于foo()-> goo() ->foo()。
- Inclusive Time (或子樹執行時間) :[包括子樹執行時間的所有執行時間。]
- Exclusive Time/Self Time :[函數執行本身的時間花費。]不包括子樹執行時間。
- Wall時間 :又名經過的時間或挂鐘時間。
- CPU時間 : CPU時間在使用者空間+ CPU時間在核心空間
安裝XHProf擴充這個擴充在"extension"子目錄裡。注:Windows的版本還沒有實作。目前我們已經在Linux/FreeBSD 上測試了xhprof。0.9.2及以上版本的XHProf也正計劃着移植到Mac OS下。[我們在Mac OS 10.5下測試過。]注: XHProf使用RDTSC指令(時間戳計數器)來實作一個真正的低資源消耗的計數器[針對elapsed time]。是以目前xhprof還 隻适用于x86架構。此外,因為RDTSC的資料不能在CPU間同步,在剖析時xhprof會将程式綁定在單個 的CPU。如果SpeedStep技術是打開的,XHProf的基于RDTSC定時器的功能就不能正 常工作了。這項技術在某些英特爾處理器上是可用的。[注:蘋果桌上型電腦和筆記本電腦一般都将SpeedStep技術預設開啟。使用XHProf,您需要禁用 SpeedStep技術。 ]下面的步驟,應該在Linux / Unix環境下進行。% cd <xhprof_source_directory>/extension/
% phpize
% ./configure --with-php-config=<path to php-config >
% make
% make install
% make testphp.ini檔案 :您可以更新您的php.ini檔案來自動加載您的擴充。将以下内容添加到你的php.ini檔案。[xhprof]
extension=xhprof.so
;
; directory used by default implementation of the iXHProfRuns
; interface (namely, the XHProfRuns_Default class) for storing
; XHProf runs.
xhprof.output_dir=<directory_for_storing_xhprof_runs > 使用XHProf來做性能分析用下面的示例程式來試着産生一些原始的性能資料:foo.php<?php
function bar($x) {
if ($x > 0) {
bar($x - 1);
}
}
function foo() {
for ($idx = 0; $idx < 2; $idx++ ) {
bar($idx);
$x = strlen("abc");
// start profiling
// run program
foo();
// stop profiler
// display raw xhprof data for the profiler run
print_r($xhprof_data);運作上面的測試程式:% php -dextension=xhprof.so foo.php你應該得到的輸出如下:Array
(
[foo==>bar] => Array
(
[ct] => 2 # 2 calls to bar() from foo()
[wt] => 27 # inclusive time in bar() when called from foo()
)
[foo==>strlen] => Array
[ct] => 2
[wt] => 2
[bar==>bar@1] => Array # a recursive call to bar()
[ct] => 1
[main()==>foo] => Array
[wt] => 74
[main()==>xhprof_disable] => Array
[wt] => 0
[main()] => Array # fake symbol representing root
[wt] => 83
)注:The raw data only contains "inclusive" metrics. For example, the wall time metric in the raw data represents inclusive time in microsecs. Exclusive times for any function are computed during the analysis/reporting phase.注意:預設情況下隻有調用次數和占用時間是記錄了的。您也可以選擇同時記錄CPU 時間和/或單純記錄記憶體使用量。将下面這一行:xhprof_enable();換成:xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); ;您應該得到如下的輸出:Array
[ct] => 2 # number of calls to bar() from foo()
[wt] => 37 # time in bar() when called from foo()
[cpu] => 0 # cpu time in bar() when called from foo()
[mu] => 2208 # change in PHP memory usage in bar() when called from foo()
[pmu] => 0 # change in PHP peak memory usage in bar() when called from foo()
[wt] => 3
[cpu] => 0
[mu] => 624
[pmu] => 0
[bar==>bar@1] => Array
[mu] => 856
[wt] => 104
[mu] => 4168
[wt] => 1
[mu] => 344
[main()] => Array
[wt] => 139
[mu] => 5936
)在分析時跳過内置函數預設情況下, PHP的内置函數(如strlen )也被分析了。如果您不希望分析内置函數(為了進一步減少性能分析的開銷貌相或減小産生的原始資料) ,您可以使用XHPROF_FLAGS_NO_BUILTINS标 志,例如:// do not profile builtin functionsxhprof_enable ( XHPROF_FLAGS_NO_BUILTINS ) ;在性能分析時忽略特定函數( 0.9.2或更高版本支援)從0.9.2版本的xhprof ,你可以告訴XHProf在性能分析時忽略一些指定函數。這樣,您就可以忽略,像功能用于間接函數調用,如call_user_func和call_user_func_array的 函數 。這些不必要的中間層,因為他們亂七八糟的父-子關系和間接的互相調用,使XHProf報告難以了解。要設定要忽略的函數清單,可以在分析時給xhprof_enable函 數 指定第二個參數[是個可選參數] 。例如,// elapsed time profiling; ignore call_user_func* during profiling
xhprof_enable(0,
array('ignored_functions' => array('call_user_func',
'call_user_func_array')));
or,
// elapsed time + memory profiling; ignore call_user_func* during profiling
xhprof_enable(XHPROF_FLAGS_MEMORY,
array('ignored_functions' => array('call_user_func',
'call_user_func_array')));設定XHProf使用者界面
- index.php :檢視一個單一運作或差異報告。
- callgraph.php :以圖檔的形式檢視一次XHProf運作的調用關系圖。
- typeahead.php :在XHProf的報告中被背景調用來進行函數的自動補全。
-
PHP源碼目錄結構
XHProf的使用者界面的由PHP實作。代碼存放在兩個子目錄中: xhprof_html/和xhprof_lib/ 。
xhprof_html目錄包含了3個頂級PHP頁面。
該xhprof_lib目錄包含進行分析和顯示的支援代碼 (計算 扁平的性能資訊,計算diffs,從多次運作中彙總資料等等) 。
- Web伺服器配置:您需要確定您的Web伺服器有權限讀取xhprof_html/目 錄可,并且能運作PHP腳本。
-
管理XHProf運作
用戶端能很靈活地儲存他們從XHProf運作中得到的XHProf原始資料。使用者界面層 的XHProf提供了一個 iXHProfRuns接口(見xhprof_lib / utils / xhprof_runs.php ),用戶端可以利用。這使得用戶端能夠告訴使用者界面層,如何擷取XHProf運作後産生的對應資料。
XHProf的UI 庫自帶的有一個基于檔案的iXHProfRUns接口實作,即“ XHProfRuns_Default”(見xhprof_lib/utils/xhprof_runs.php)。這個自帶的實作将XHProf運作結 果存在ini配置的xhprof.output_dir參 數指定的某個目錄下。
一次XHProf運作,必須用一個命名空間和運作編号來唯一确定。
一)XHProf資料的永久儲存 :
假設您使用的iXHProfRuns接口的XHProfRuns_Default這 個預設實作方式,一個典型的XHProf運作并儲存結果的操作可能就是這樣子的:
// start profiling xhprof_enable(); // run program .... // stop profiler $xhprof_data = xhprof_disable(); // // Saving the XHProf run // using the default implementation of iXHProfRuns. // 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(); // Save the run under a namespace "xhprof_foo". // // **NOTE**: // By default save_run() will automatically generate a unique // run id for you. [You can override that behavior by passing // a run id (optional arg) to the save_run() method instead.] // $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo"); echo "---------------\n". "Assuming you have set up the http based UI for \n". "XHProf at some address, you can view run at \n". "http://<xhprof-ui-address >/index.php?run=$run_id&source=xhprof_foo\n". "---------------\n";
上述代碼就會将運作結果儲存在xhprof.output_dir ini參數指定的特定目錄下。檔案的名稱可能會是49bafaa3a3f66.xhprof_foo類似的東 東 ;兩部分分别是運作編号( “ 49bafaa3a3f66 ” )和命名空間( “ xhprof_foo ” )。[如果您想建立/指定自己的run ID (如資料庫中的序列号,或時間戳) ,您可以通過明确的給save_run方法 指定一個run id。
b )使用自己實作的iXHProfRuns
如果您希望您的XHProf運作存儲在不同的資料庫(例如用一個壓縮格式,或者其他什麼地方比如資料庫等),您需實作一個類,這個實必須實作 iXHProfRuns ( )接口。
您還需要修改“xhprof_html/"目錄中3個主要的PHP入口檔案 (index.php , callgraph.php , typeahead.php ),使用新的類而不是預設的類XHProfRuns_Default 。改變3個檔案的這一行:
您還需要“include”聲明了上述class的檔案。$xhprof_runs_impl = new XHProfRuns_Default();
-
從使用者界面中通路各次運作
一)看單一運作報告
要檢視run id是<run_id>和命名空間是<namespace>的報告,通路URL:
http://<xhprof-ui-address>/index.php?run=<run_id>&source=<namespace>
例如,
http://<xhprof-ui-address>/index.php?run=49bafaa3a3f66&source=xhprof_foo
二)檢視diff報告
要檢視命名空間<namespace>下runid分别是< run_id1>和<run_id2>的兩個報告,通路URL:
http://<xhprof-ui-address>/index.php?run1=<run_id1>&run2=<run_id2>&source=<namespace>
三)彙總報告
您也可以指定一組run id來彙總得到您想要的報告視圖。
如果你有三個XHProf運作,都在"benchmark‘命名空間下,run id分别是1,2,3。要檢視這些運作的彙總報告:
http://<xhprof-ui-address>/index.php?run=1,2,3&source=benchmark
權重彙總 :進一步假設,上述3個運特分别對應三種程式,p1.php,p2.php和p3.php ,通常以20%,30%,50%機率混合:要檢視彙總報告所對應的權重平均數這些運作使用:
http://<xhprof-ui-address>/index.php?run=1,2,3&wts=20,30,50&source=benchmark
在生産環境中使用XHProf的注意 事 項這裡給出一些意見和準則。您的情況可能會有所不同:
-
CPU的計時器( getrusage )在Linux上開銷很大。為了在函數級别更有用,這個是粗粒度的(毫秒精确度,而不是微秒水準)。是以,使用XHPROF_FLAGS_CPU模式時, 在報告裡,數字上的誤差往往會更高。
我們建議在生産環境中使用 "占用時間+記憶體" 來做性能分析。[注:記憶體性能分析模式的額外開銷很低。 ]
// elapsed time profiling (default) + memory profiling xhprof_enable(XHPROF_FLAGS_MEMORY);
-
對随機抽樣的部分page/request來做性能分析,對于擷取您的生産環境的負載 情況特征資料,其實足夠好了了。
分析萬分之一的請求,可以用下面的代碼:
request結束時(或是在退出函數中) ,您可以這麼做:if (mt_rand(1, 10000) == 1) { xhprof_enable(XHPROF_FLAGS_MEMORY); $xhprof_on = true; }
然後,您就可以用xhprof_aggregate_runs()來按時間(比如,每5 分鐘/每小時/每天),或是按頁面類型/request類型來彙總。if ($xhprof_on) { // stop profiler $xhprof_data = xhprof_disable(); // save $xhprof_data somewhere (say a central DB) ... }
輕量級采樣模式Xhprof擴充還提供了一個輕量級采樣模式 。采樣間隔為0.1秒。采樣記錄了整個函數調用堆棧。如果想以增加極低的負載作代價來進行性能監控和診斷,采樣模式就是你想要的。XHProf擴充提供的與采樣模式相關的函數有xhprof_sample_enable()和xhprof_sample_disable() 。[ 待定 :關于采樣模式更詳細的文檔。 ]附加功能xhprof_lib/utils/xhprof_lib.php文 件包含額外的庫函數,可用于維護/彙總XHProf運作結果。例如:
- xhprof_aggregate_runs() :可用于多次XHProf運作結果彙總到一個單一的運作。這可以幫助您使用XHProf來建立一個全系統“的函數級别”的性能監測工具 。 [例如,您可以在生産環境中定期抽樣XHProf的資料,産生小時/日級别的報告。 ]
- xhprof_prune_run() :彙總大量XHProf運作結果(特别是如果它們對應不同類型的程式)将可能導緻callgraph規模變得太大。您可以使用xhprof_prune_run功 能來修剪的callgraph資料中隻占總運作時間中很小比例的子樹。
- JQuery的Javascript :在提示和函數名稱補齊上 ,我們利用了JQuery這個JavaScript庫。JQuery是基于MIT和GPL licencse ( http://docs.jquery.com/Licensing ) 的。XHProf用到的JQuery相關代碼,在xhprof_html/jquery子 目錄。
- dot(圖像生成工具) :調用關系視圖工具( [檢視Callgraph ] )這個功能依靠dot工具實作。 “點”是一種繪制/生成有向圖的工具。
-
--EOF--
額,樣式我不管了。覺得不好的還是檢視原文吧。