隨着 jQuery、Dojo、YUI 等框架的興起讓構建 Web2.0 應用更加容易,但隨之帶來的定位等應用問題也愈來愈難,尤爲是與性能相關的。dynaTrace Ajax Edition 是一個強大的底層追蹤、前端性能分析工具,該工具不只可以記錄瀏覽器的請求在網絡中的傳輸時間、前端頁面的渲染時間、DOM 方法執行時間以及 JavaScript 代碼的解析和執行時間,還能夠跟蹤 JavaScript 從執行開始,通過本地的 XMLHttpRequest、發送網絡請求、再到請求返回的全過程。html
dynaTrace Ajax 目前有兩個版本,免費版和商業版,它們之間的區別可查看 版本比較,本文主要是針對免費版本的介紹。在 3.0 以前的版本只支持運行在 IE 瀏覽器下,包括 IE六、IE七、IE8, 在 3.0 Beta 版以後可同時支持在 IE 和 Firefox 瀏覽器上的性能跟蹤。前端
回頁首html5
下載 DynaTrace 最新的版本 , 雙擊安裝文件,點擊「下一步」即可完成安裝,安裝好的操做界面如圖 1 所示:web
點擊中間齒輪狀的圖標可對工具的屬性進行配置,以下圖 2 所示:ajax
從上圖的:編程
能夠經過兩種方式啓動 DTA 跟蹤您的頁面:瀏覽器
在關閉瀏覽器以前,能夠快速看一下 dynaTrace 軟件界面,會看到在「Browsers 」下面有一個節點,那就是當前正在從瀏覽器中收集的信息。咱們能夠在運行瀏覽器的同時分析這些數據,也能夠關閉瀏覽器,再從 Sessions 中分析捕獲的信息。緩存
此外,在實際的操做過程中,可能會須要跟蹤打開頁面後的一系列操做(例如點擊某個按鈕觸發的事件等), 免費版的 dynaTrace 跟蹤的信息不能按照 Page 或者 Action 自動進行分離,這種狀況下,咱們能夠經過在操做過程當中經過添加標記 (Insert Mark ) 的方式從 PurePath 視圖中來區分每一個 Action 行爲的時間分割。即在操做前添加一個標記,操做完成後再添加一個標記,再從 PurePath 視圖中分析所添加標記之間的比較耗時的請求。以下圖 5 所示:服務器
此外,它還具備導入導出的的功能即將收集到的數據導出爲 session 文件再導入到 DynaTrace 裏面進行分析。具體操做可經過在 Cockpit 面板中 Sessions 文件夾下選擇要導出的 Session,右鍵或者從工具條裏的點擊 Export Session 按鈕即能完成導出操做,導入文件的操做與此相似。網絡
在討論 dynaTrace 工具以前,先簡單瞭解一下在 Web2.0 下常常會碰到的一些客戶端的性能問題,這些話題雖然不是本文的主題,可是和本文密切相關,由於您知道了大體存在的問題,再使用相應的工具去發現這些問題就會簡單不少。
在 Web2.0 應用程序中,JavaScript 的執行經常會阻礙瀏覽器端資源的下載和增長頁面的 Loading 的時間,致使這個問題的因素主要有:
下面將結合實際工做中碰到的案例,介紹如何使用 dynaTrace 來跟蹤和分析客戶端的性能問題。
下面記錄的結果是以咱們目前正開發的一個實際項目(IBM Docs)中的一個案例 - 在 Web 中打開一個 PPT 文檔,根據 dynaTrace 收集的信息來分析存在的性能問題。
從 Cockpit 面板中打開 Performance Report 視圖,如圖 6 所示:
性能報告視圖中記錄了全部訪問的網頁的詳細信息,從這個視圖當中咱們能夠獲得如下信息:
在個人例子中,如下內容引發了個人注意:
時間軸視圖能夠經過雙擊 Cockpit 面板中的 TimeLine 節點打開或者在 Performance Report 中經過在某個 URL 上點擊右鍵,選擇「DrillDown-TimeLine 」打開。根據 性能報告視圖 打開耗時比較長的 URL 的 TimeLine, 經過工具欄或右鍵菜單,能夠打開更多選項,好比內容類型和 JavaScript 觸發器的顏色值,或者顯示更多事件,好比鼠標移動、點擊和鍵盤事件。打開本案例的時間軸視圖,如圖 7 所示:
在此視圖下,咱們可觀測到:
放大右邊網絡請求時間比較長的部分(在個人例子中,從 16s 到 29s 時間片 ), 經過在開始處點擊鼠標左鍵拖拽到結束位置鬆開鼠標拖拽,視圖將放大到下面截圖中顯示的時間片上,以下圖 8 所示 :
經過放大的時間片右鍵選擇「Drill Down to Timeframe e」進入 PurePath 視圖,顯示當前所放大的時間片上全部的活動。
能夠經過雙擊 Cockpit 面板中的 PurePath 節點打開也能夠選中時間軸上的一段右鍵選擇「Drill Down to Timeframe 」來到 PurePath 視圖,進一步進入每一個動做去觀察哪些事件觸發執行了 JavaScript 和哪些函數的執行耗時比較長。
這裏接着上節所述進入 PurePath 視圖 , 以下圖所示:
鼠標點擊上圖中的第二個時間片即 JS 佔用 14 秒的,面板同時會更新當前所選活的信息,顯示 JavaScript 代碼執行過程,包括每一個方法的執行時間和調用的參數及返回值。咱們不只能夠看到 JavaScript 方法,也能看到 DOM 訪問和 Ajax 請求。
從詳細信息欄咱們可觀察到
鼠標點擊上面任何一列可進行排序操做,根據 JS 執行時間長短經過鼠標點擊展開也能夠經過右鍵點擊「擴展子樹」展開層次圖找到是哪一個方法的調用致使執行了這麼長的時間。從上圖調用棧中可看出 contentDomHandle 來自應用程序的 JavaScript API 的調用總耗時最長,從它的子樹中可觀察到 JavaScript 執行的時間分佈:
addContextMenu
<div> 方法執行次數比較多,雖然方法自己的執行時間 150ms,但調用次數比較多的話就會致使總的執行時間比較長。SimulateSlideClick
耗時
2.5 秒concord.util.events.publish
耗時
3 秒爲了更方便發現這些函數的性能問題,能夠右鍵 contentDomHandle 方法,選擇「Drill Down->Hot Spots 」進入 HotSpots 視圖 。
另外,PurePath 視圖提供了多種分析方法,您能夠經過直接鍵入您要查找的內容來篩選或查找您須要的數據項,也經過右鍵菜單或工具欄按鈕添加過濾規則可讓軟件只顯示特定信息。
綜上所述,能夠從 PurePath-->Drill Down 進入該視圖,也能夠從面板中直接打開 HotSpot 視圖來分析瀏覽中訪問過的全部 JavaScript、DOM 和頁面渲染操做。
接着上一節的 contentDomHandle () 方法調用爲例,以下圖所示:
從上圖中能夠看到每一個方法的調用次數,JS 的執行時間以及總的執行時間等信息:
從個人例子中,就會很明顯的發現以下性能問題:
到這裏咱們基本能夠找出從時間軸視圖中耗時 13 秒的 JavaScript 具體是被哪些函數的調用佔用了,也發現了一些比較明顯的性能問題。再回到 HotSpot 總的頁面看是否還有其餘性能問題 ( 從 Cockpit 面板中雙擊 HotSpot 節點 ),以下圖所示:
上圖默認是按照操做或方法自己的耗時 (Exec[ms]) 不包括子方法來排序的 , 咱們發現除了瀏覽器的渲染比較耗時以外,最有可能存在性能問題的就是應用程序方法的調用。例如在我這個案例中,就發現如下幾個問題:
雙擊 dojo.destroy(div),打開它的 Back Traces,以下圖所示:
從上圖可得知,dojo.destroy(<div>) 僅被 applySlideSorterStyles 方法調用了一次就執行了 1 秒的時間,這也是比較可疑的性能問題。另外,您也能夠經過總的執行時間來排序,以下圖所示,這裏您能夠找到最耗時的方法的入口:
最後咱們再來看一下 dynaTrace 的另外一個視圖 - Network 視圖,經過雙擊左側 Cockpit 面板中的 Network 節點,或從 Summary 視圖中某個 URL 上右鍵選擇「Drill Down – Network」進入到 Network 視圖,該圖顯示了全部網絡請求,以下圖所示:
Network 視圖高亮標記出超慢的請求以及鏈接等待時間。
這個視圖下會用顏色標記每一個請求,而且用紅色高亮標記出耗時最長的下載請求。默認狀況下會以 TimeLine 上的發生順序來排列,您能夠點擊任何一列來進行排序。對於每一個請求咱們能夠看到資源是否來自瀏覽器緩存(Cached 欄),請求類型(Network 或 Ajax),HTTP 狀態,Mime 類型,大小,在 DNS、網絡鏈接、服務器響應、網絡傳輸和等待上消耗的時間。界面底部顯示了 HTTP 請求和響應頭以及返回的實際內容。
常見的性能問題及解決辦法:
一般咱們都是對性能上有問題的頁面利用手動的方式訪問每一個頁面再用 dynaTrace 記錄和收集數據,但如果對每一個頁面都要記錄或是針對每一個不一樣的應用程序的版本僅對幾個頁面作這些操做也是須要付出比較大的人力。幸虧 dynaTrace 還提供了咱們一些新的 Feature 能夠用腳本工具代替人工方式驅動瀏覽器自動收集數據。當您用像 Selenium、Watir、WebAii 這樣的工具運行測試腳本時,dynaTrace 能夠自動從每一個瀏覽器 session 中收集性能信息。
如何使用 Selenium 整合 dynaTrace 實現自動化收集數據有兩種方式 ;
public class GoSpaceDynaTraceSeleniumTest { Selenium selenium = null; @Before public void startup() { selenium = new DynaTraceSelenium("localhost", 4444, "*iexplore", "http://localhost:9090"); selenium.start();
}
void addMark(String marker) { defaultSelenium.runScript("try Unknown macro: { _dt_addMark('" + marker + "') } catch(e) { }"); }
dynaTrace Ajax 是前端的軟件開發工程師和性能分析師的很是有用且重要的工具。經過該工具的不斷更新,功能的不斷強大,所支持的瀏覽器的不斷增長以及與持續集成工具相結合,這樣就能夠更容易、更早、更頻繁地發現應用程序在不一樣瀏覽器上的性能問題。