JavaScript 性能分析新工具 OneProfile

OneProfile 是一個網頁版的小工具,可以用全新的方式展示 JavaScript 性能分析的結果,幫助開發者洞悉函數調用關系,優化應用性能。

點擊打開 OneProfile

背景

Chrome Dev Tools 自帶的 CPU Profile 功能非常好用。用它可以方便的生成 JavaScript 的 Flame Chart

Flame Chart
Flame Chart

更棒的是你可以把 Flame Chart 導出,留著下次或者拷貝到其它機器上查看,特別好奇它是怎么實現的。

但是網上關于它的文件格式以及怎么畫圖的文檔非常稀有,所以我自己摸索了一下它的文件格式,并嘗試著用另一種方式展示 CPU Profile 的結果。

如何生成 CPU Profile 文件

使用最新版的 Chrome 打開任意一個 測試網站,按 F12 打開 Devtools, 切換到 Profiles 頁,點擊 Start 開始
收集 Profile 信息,在當前頁面任意滑動鼠標等待大約5秒后, 點擊 Stop 停止 Profile。在生成的 CPU Profile 名字上單擊右鍵可以導出 .cpuprofile 后綴名的文件。

你可以自己生成一個,也可以直接下載這個用來測試 sample.cpuprofile

理解 .cpuprofile 文件格式

用你的編輯器打開 sample.cpuprofile ,你會驚奇的發現:

1. sample.cpuprofile 其實就是一個 JSON 格式的文件,有 head, timestamps, samples 等幾個重要的屬性

2. head 指向一個結點,官方的名字叫CpuProfileNode,同時它的 children 指向子結點, 因此是一個嵌套結構

3. CpuProfileNode 有很多重要的屬性,包括 functionName,lineNumber,columnNumber,hitCount 等

4. timestamps 是一個數組,記錄著 Profiling 過程中每個采樣點的時間戳

5. 對應 timestamps 下的每個時間點,samples 數組相同的位置都會有一個數字,這個數字比較神秘,后面解釋

CpuProfileNode 詳解

{
  "functionName": "lineTo",
  "scriptId": "0",
  "url": "",
  "lineNumber": 0,
  "columnNumber": 0,
  "hitCount": 45,         // 被采樣到的次數
  "callUID": 6,           // 函數入口的 UID
  "children": [],
  "positionTicks": [      
    {
      "line": 1,
      "ticks": 45
    }
  ],
  "deoptReason": "",     // 逆優化的原因
  "id": 11
}

samples, timestamps 和 CpuProfileNode 的關系

如果從 head 開始,對 head 結點及其 children 屬性下的結點做一次深度優先的遍歷,每個可能路徑都會有一個編號。
研究表明這個數字正對應于 samples 的值。因此知道了路徑編號,便可以知道那些函數處在激活狀態。在 OneProfile 中用藍色表示。

OneProfile 使用說明

鏈接地址

使用 Chrome 打開: OneProfile

圖例

黑色 系統函數

暗紅色 存在逆優化的函數,鼠標懸停可見原因

藍色 當前采樣點活動的函數

操作

滾輪 縮放窗口

prev 前一個采樣點

next 后一個采樣點

一些用例

某在線地圖網站的前端代碼,紅色較多說明存在大量 v8 無法優化的代碼

baidu
baidu

是不是很像外星人

xiaodian
xiaodian

( 請原諒作者笑點低 >< )

關于

本文相關的源碼在:
https://github.com/wyvernnot/javascript_performance_measurement/tree/gh-pages/cpuprofile_topology;

本文由OneAPM工程師原創 ,想閱讀更多技術文章,請訪問OneAPM官方技術博客

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,932評論 18 139
  • php性能分析工具xhprof分析 facebook,做為世界上最大的php應用網站,為php貢獻出了hhvm x...
    meng_philip123閱讀 1,354評論 0 4
  • 在做前端開發時,我們需要用到一些調試工具用來調試我們的HTML、CSS或者JS代碼,俗話說預先善其事必先利其器,這...
    Rella7閱讀 24,064評論 0 15
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,301評論 25 708
  • 獅緣隊今年的第一期培訓終于圓滿結束了。 雖然在講師確定前因我的小失誤帶來了波折, 導獅,隊長,二副的積極協調幫助我...
    仙小九閱讀 247評論 0 0