檢視原始碼 fprof - 檔案追蹤分析器
fprof
是一個分析工具,可用於了解不同函數在哪些進程中消耗了多少處理時間。
fprof
使用帶有時間戳記的追蹤來收集分析資料。因此,不需要對要分析的任何模組進行特殊編譯。
fprof
呈現來自主機作業系統的實際時間,並假設作業系統排程會以公平的方式隨機載入被分析的函數。它會同時計算自身時間,即函數自身執行所用的時間,以及累計時間,即包含呼叫函數的執行時間。
分析基本上分為 3 個步驟
追蹤到檔案。
分析:讀取追蹤檔案,並將原始分析資料收集到節點上的內部 RAM 儲存中。在此步驟中,追蹤資料可以文字格式傾印到檔案或主控台。
分析:原始分析資料會進行排序,並以文字格式傾印到檔案或主控台。
由於 fprof
將追蹤資料儲存到檔案,因此執行階段效能的降低會降到最低,但仍然遠非可忽略不計,特別是對於本身大量使用檔案系統的程式。追蹤檔案的放置位置也很重要;在 Unix 系統上,/tmp
通常是個好選擇,而任何網路掛載的磁碟都是個糟糕的選擇。
fprof
也可以跳過檔案步驟,直接追蹤到自身的追蹤器進程,以便在執行階段進行分析。
以下章節顯示一些如何使用 fprof
進行分析的範例。
從原始碼進行分析
如果您可以編輯和重新編譯原始碼,則可以在要分析的程式碼之前和之後插入 fprof:trace(start)
和 fprof:trace(stop)
,這樣會很方便。所有衍生進程也會被追蹤。如果您想要使用預設值以外的檔案名稱,請使用 fprof:trace(start, "my_fprof.trace")
。
執行完成後,可以使用 fprof:profile()
或 fprof:profile(file, "my_fprof.trace")
處理原始分析資料(若為非預設檔案名稱)。
最後,使用 fprof:analyse()
在主控台上建立資訊表,或使用 fprof:analyse(dest, [])
在檔案中建立資訊表,或使用 fprof:analyse([{dest, "my_fprof.analysis"}, {cols, 120}])
建立較寬的非預設檔案名稱列表。
分析函數
如果您有一個執行您想要分析的任務的函數,並且該函數會在分析應該停止時返回,則可以使用 fprof:apply(Module, Function, Args)
進行追蹤步驟,這會很方便。
如果追蹤應該在函數返回後繼續進行,例如,如果它是會衍生要分析的進程的啟動函數,請使用 fprof:apply(M, F, Args, [continue | OtherOpts])
。必須在之後的適當時間使用 fprof:trace(stop)
停止追蹤。
立即分析
也可以立即追蹤到建立原始分析資料的分析進程,也就是說,短路追蹤和分析步驟,這樣檔案系統就不會用於追蹤。
執行以下操作
{ok, Tracer} = fprof:profile(start),
fprof:trace([start, {tracer, Tracer}]),
%% Run code to profile
fprof:trace(stop);
這會減少檔案系統的負載,但會對 Erlang 執行階段系統造成更大的負載。