Chrome運行時性能瓶頸分析

一,初探,根據現象發現問題

chrome的performance知道很久了,但總是沒有特別權威且跟上時代的學習資料,這次痛定思痛,直接看英文文檔,一點點把這塊啃掉,本筆記基于Chrome 59


step 1: 隱身模式打開chrome

目的是避免緩存以及不必要的問題


step 2: 打開測試地址

谷歌性能測試地址googlechrome.github.io/devtools-sa…
可以看到如下的頁面:


頁面中有一些藍色小方塊在運動


step 3: 限制cpu速度

由于有些用戶的設備cpu性能很高,無法很好的分析移動端,或者發現低級設備的性能問題,所以我們要降速
找到控制臺中的performance項,找到CPU選項,選擇降低4倍性能或6倍性能


step 4:添加運動小塊,找到性能瓶頸

前面限制了cpu的性能,接下來就要找到性能瓶頸了
連續點擊Add 10按鈕,向頁面中添加小塊,直到自己都感覺頁面上小塊運動出現明顯卡頓


類似下面這種情況,就已經明顯卡頓了


step 5:先看看優化后的效果會怎樣?

點擊一下Optimize優化,觀察一下效果


可以看到頁面瞬間變的賊流暢


step 6:體驗過優化,再體驗一次不優化

再點擊一次Un-Optimize(不優化)按鈕,可以看到又卡的要死

ok,到這里,大家已經能夠通過現象發現性能的差異了,接下來就是要分析現象了


二,了解performance各模塊

如何分析現象,肯定要依賴數據,這里就要用到chrome的performance功能了
先將頁面切到非優化的狀態,點擊“錄制”按鈕

錄制4s-5s即可:

然后就可以看到錄制的效果了:


上面這些數據看不懂沒關系,現在來一步步了解各個部分都有哪些內容


step 1:了解Fps

fps:是指頁面每秒幀數
fps = 60 性能極佳
fps < 24 會讓用戶感覺到卡頓,因為人眼的識別主要是24幀


圖中藍色標注出來的區域,就是FPS記錄的信息
放大點看,FPS由兩部分組成:
1,紅色的條
2,綠色的半透明條


action :1 ?切換至“已優化”狀態

此時切換優化狀態,到已優化的狀態,再次進行性能錄制:


得到Fps數據如下:

可以看到此時:
1,沒有了紅色條
2,綠色半透明條的高度,明顯要比未優化的場景高度要高不少

總結:

  • 紅色:意味著幀數已經下降到影響用戶體驗的程度,chrome已經幫你標注了,這塊有問題

  • 綠色:其實就是Fps指數,所有綠色柱體高度越高,性能越好


step 2:了解Cpu


上圖中Fps下面的位置,即是Cpu信息
我們再采集一個真實業務的cpu數據,如下圖:

對比可以發現,cpu數據的一些特性:

  • 1,cpu包括兩種狀態:

    • (1)充滿顏色

    • (2)不充滿顏色

  • 2,cpu是否充滿顏色和fps存在聯系


step 3:了解Net

Net部分可以將屏幕逐幀錄制下來,可以幫助觀察頁面的狀態,主要用處,可以幫助分析首屏渲染速度


step 4:了解Frames

1,查看特定幀的fps


Frames部分,主要用于查看特定幀的fps,可以查看特定的幀情況。

2,懸停其上,可以查看數據


可以看到:

  • 這一幀的時間間隔是129.1ms

  • 當前的fps是1000ms/129.1ms = 7.75fps,約等于8fps

這里主要體現的是頁面兩次刷新之間間隔了129.1ms

3,點擊Frames塊,得到更詳細的數據


點擊Frames可以顯示當前關鍵幀的詳細信息:

  • 1,duration是當前幀從796.31ms開始等待,796.31ms+127.73ms后進行了一次渲染

  • 2,fps還是老算法,1000ms/127.73ms約等于7fps

  • 3,最下面是關鍵幀的視圖畫像


step 5:了解FPS快捷工具

1,在chrome中,還有格more tools選項,選中rendering選項

2,開啟fps meter開關

3,直接在頁面上,出現了一個fps統計器


這個東西,暫時先關閉,不利于系統性的學習

三,找到瓶頸

前面已經知道我們的測試頁面有性能問題,那么接下來就要想為什么了?


step 1:了解Summary

對性能進行錄制完成的時候,會默認在底部展示一個Summary摘要,顯示全局的信息


上面展示了0~5.52s錄制時間的具體耗時:

  • 1,script執行耗時1952.8ms

  • 2,render渲染耗時2986.8ms

  • 3,Painting重繪耗時472.1ms


主要就是這3個耗時,知道了這三部分耗時,只是知道了,哪有問題,但具體問題在哪呢?


step 2:了解Main


上圖,紅色邊框圈出來的,就是Main部分,其中每一塊是每一幀中所做的事情


目前這樣看不出來什么,腦殼疼,為了方便我們觀看,我們可以在fps、cpu、net模塊,點擊一下,縮小時間區間


如上圖,可以通過縮小時間區間,從而放大Main中的內容
現在已經能夠看到,Main中展示的是火焰圖,也就是函數調用的堆棧

火焰圖,可以簡單理解,x軸表示時間,y軸表示調用的函數,函數中還包含依次調用的函數,y軸只占用x軸的一個時間維度


step 3:識別問題,紅色三角號


上圖中,可以看到Animation Frame Fired右上角有個紅色三角號,這就是chrome自動幫助識別出有問題的部分
就像FPS中的紅條一樣,用來識別問題

上圖可以看到提示了Warning : 重復處理程序耗時287.77毫秒


step 4:追溯問題,定位代碼位置

如上圖,可以看到函數調用在代碼中的位置,可以點擊進行查看


雖然定位到了,是方法update造成的問題,但不夠明確,所以需要進一步探索


step 5:進一步分析問題位置


繼續查看Main,可以看到app.update下面有很多紫色的條,紫色條本身表示渲染
但請注意!!! 紫色條上還有更小的
運用前面學過放大功能,調整時間區間

可以看到,每個小紫條上,都有一個紅色三角
前面提到:紅色三角就是chrome幫助自動識別有問題的地方
查看提示信息:強制回流可能是性能瓶頸
點擊查看摘要:

可以看到問題定位在了,app.js的71行,點擊查看,能夠看到是對每一個元素進行樣式修改

此代碼的問題在于,在每個動畫幀中,它會更改每個方塊的樣式,然后查詢頁面上每個方塊的位置。由于樣式發生了變化,瀏覽器不知道每個方塊的位置是否發生了變化,因此必須重新布局方塊以計算其位置。

避免這種情況的出現,可以參考developers.google.com/web/fundame…


step 6:對比優化的效果


demo中存在兩種狀態,優化和非優化
可以看到優化的狀態,script和render的時間都大大減少了
所以fps明顯提高

step 7:性能優化的知識儲備

使用rail模型測量性能developers.google.com/web/fundame…
基礎儲備:

  • 渲染性能概述developers.google.com/web/fundame…

  • A Frame 的剖析aerotwist.com/blog/the-an…

轉載于:https://juejin.im/post/5cd15712e51d453a393af4c5

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536477.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536477.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536477.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue-router之路由鉤子(八)

路由鉤子&#xff0c;即導航鉤子&#xff0c;其實就是路由攔截器&#xff0c;vue-router一共有三類&#xff1a;全局鉤子&#xff1a;最常用路由單獨鉤子組件內鉤子1、全局鉤子在src/router/index.js中使用&#xff0c;代碼如下&#xff1a;// 定義路由配置const router new V…

java第一 ++--

大的轉換小的自動轉換 byte -> short -> int -> long -> float -> double l 自動類型轉換 表示范圍小的數據類型轉換成范圍大的數據類型&#xff0c;這種方式稱為自動類型轉換 自動類型轉換格式&#xff1a; 范圍大的數據類型 變量 范圍小的數據類型值&#xf…

在加拿大讀大學被開除了,以后該怎么辦?

在加拿大讀大學被開除了&#xff0c;以后該怎么辦&#xff1f; 一天晚上正準備睡覺的時候&#xff0c;手機振動&#xff0c;打開一看&#xff0c;是一條微消息&#xff0c;“在加拿大讀大學被開除了&#xff0c;以后該怎么辦&#xff1f;”又一個留學生遇到的棘手問題。在國內上…

GO編程程序員修煉秘籍:十本經典書單

隨著BAT、今日頭條、京東、抖音等大型互聯網公司對Go語言的大范圍應用&#xff0c;帶動更多互聯網企業采取技術跟隨戰略&#xff0c;Go語言發展前景一片大好。5月20日工業和信息化部信息中心發布《2018中國區塊鏈產業白皮書》&#xff0c;Go語言與區塊鏈成為“數字中國”建設的…

AngularJs 冷兵器雜談

一、指令 scope.template中的dom屬性值可以直接用{{attr}}表達式取到scope中的屬性attrlink中attr.$observe可以監聽scope屬性attr的動態變化需要改變$scope上的屬性值時&#xff1a;$scope.$apply(function(){$scope.attr newValue }) 復制代碼二、服務 循環依賴&#xff08;…

02-print的用法

print的常用&#xff1a; print(hello world!)print(hello,world!) # 逗號自動添加默認的分隔符&#xff1a;空格。print(hello world!) # 加號表示字符拼接。print(hello,world,sep***) # 單詞間用***分隔。print(# * 20) # *號表示重復20遍。print(are you sure?, end)…

單田芳白眉大俠全320回下載

1、搜索“十方評書網”。 2、要下載那個評書家的選擇那個評書家。 3、然后選擇自己要下載的下載可以了。 轉載于:https://blog.51cto.com/14204019/2392323

pip模塊 redis、xlrd、xlutils、nnlog、requests

# import模塊的實質&#xff1a;把python文件執行一遍,# 導入模塊的順序&#xff0c;1、從當前模塊找&#xff0c;如果當前模塊沒有&#xff0c;2、就去python環境變量里面找 pip install redispip install xlrd pip install xlutilspip install nnlogpip install requests pip…

react.js基礎

現在最熱門的前端框架有AngularJS、React、Bootstrap等。自從接觸了ReactJS&#xff0c;ReactJs的虛擬DOM&#xff08;Virtual DOM&#xff09;和組件化的開發深深的吸引了我&#xff0c;下面來跟我一起領略ReactJs的風采吧~~ 文章有點長&#xff0c;耐心讀完&#xff0c;你會有…

第 11 章 日志管理 - 089 - 初探 ELK

在開源的日志管理方案中&#xff0c;最出名的莫過于 ELK 了。 ELK 是三個軟件的合稱&#xff1a;Elasticsearch、Logstash、Kibana。 Elasticsearch 一個近乎實時查詢的全文搜索引擎。Elasticsearch 的設計目標就是要能夠處理和搜索巨量的日志數據。 Logstash 讀取原始日志&…

【轉】Kotlin 新版來了,支持跨平臺!

作者&#xff1a;Tamic 原文鏈接&#xff1a;juejin.im/post/5cd8f9… 谷歌在今年的 I/O 大會上宣布&#xff0c;Kotlin 編程語言現在是 Android 應用程序開發人員的首選語言(谷歌宣布 Kotlin 成為安卓開發首選)。 還有一個好消息, Kotlin 1.3.30 正式發布&#xff0c;做了對ap…

WebSocket輕松單臺服務器5w并發jmeter實測

測試結論 nginx最多只能維持(65535*后端服務器IP個數)條websocket的長連接&#xff0c;如果后端websocket服務器IP只有一個&#xff0c;那么就只能最多支持65535條連接。瓶頸就產生在了nginx上建議采用LVS的DR模式來做負載均衡&#xff0c;這樣最大長連接數目就只和websocket服…

人工智能的歷史

AI(Artificial Intelligence)即人工智能&#xff0c;最初是在1956 年被提出&#xff0c;人工智能研究如何用計算機去模擬、延伸和擴展人的智能&#xff1b;如何把計算機用得更聰明&#xff1b;如何設計和建造具有高智能水平的計算機應用系統&#xff1b;如何設計和制造更聰明的…

nginx配置 vue打包后的項目 解決刷新頁面404問題|nginx配置多端訪問

訪問vue頁面時&#xff0c;/# 使url看著不美觀&#xff0c;使用 H5 history模式可以完美解決這個問題&#xff0c;但需要后端nginx幫助。接下來我們自己配置一下。 使用前端路由&#xff0c;但切換新路由時&#xff0c;想要滾動到頁面頂部&#xff0c;或者保持原先的滾動位置&a…

算法導論2nd 10.1-7

為什么80%的碼農都做不了架構師&#xff1f;>>> 思路&#xff1a;兩個隊列q1和q2&#xff0c;兩個隊列指針pusher和poper分別指向q1和q2&#xff0c;push時調用pusher->enqueue&#xff0c;然后將poper里的元素全部dequeue并enqueue到pusher&#xff0c;最后交換…

阿里云Windows2012 R2服務器IPV6配置記錄

要上蘋果APP&#xff0c;則必須要支持IPV6和HTTPS&#xff0c;阿里云本身沒有開放IPV6地址。因此需要進行IPV6的相關配置。查了很多IPV6的配置資料&#xff0c;最終選擇用HE進行IPV6設置。在這過程中遇到一些問題&#xff0c;以記錄下來以備注。 1、IPV6 Tunnel Broker設置 在H…

mycat 1.6.5 for mysql 8分表攻略

2019獨角獸企業重金招聘Python工程師標準>>> 簡述 mycat 對于 mysql 的支持有版本要求&#xff0c;目前 1.6.5 不支持 mysql 8.0 版本。因為mysql 8.0 的加密方式發生了變化。 mycat 1.6.5 連接 mysql 8.0 的兩個方式 mysql 8.0 采用兼容方式&#xff0c;&#xff0…

Funcode-貪吃蛇

自己編寫的一個小游戲&#xff0c;本來打算做貪吃蛇&#xff0c;結果不會使蛇的身子隨蛇頭方向改變而改變就換了種想法&#xff0c;最后變成了這樣一個另類的小游戲&#xff0c;“笑哭“&#xff0c;下面是程序的主要代碼&#xff0c;如果有興趣也可以下載完整程序代碼資源&…

mac 使用遠程連接

https://www.jianshu.com/p/9cc90361f37a轉載于:https://www.cnblogs.com/xiangsj/p/10876400.html

systemtap執行過程中報probe timer.profile registration error

probe timer.profile registration error 今天在執行火焰圖的過程中&#xff0c;代碼報錯&#xff0c;probe timer.profile registration error 經過查詢、分析可能是在該平臺該函數是不安全、不共享的。 將 probe timer.profile { 用該代碼替換即可 probe perf.sw.cpu_clock !…