成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

會用 Performance 工具,就能深入理解 Event Loop

開發 前端
但很多人對 Event Loop 的理解只是停留在概念層面,并沒看過真實的 Event Loop 是怎樣的。

網頁加載后,瀏覽器會解析 html、執行 js、渲染 css,這些工作都是在 Event Loop 里完成的,理解了 Event Loop 就能理解網頁的運行流程。

但很多人對 Event Loop 的理解只是停留在概念層面,并沒看過真實的 Event Loop 是怎樣的。

其實在 Performance 工具里就可以看到,今天我們一起來看一下:

首先我們需要一個網頁,我這里用的是 react 測試 fiber 用的網頁:

https://claudiopro.github.io/react-fiber-vs-stack-demo/fiber.html

圖片

點擊 Performance 面板的 reload,錄制 3 s 的數據:

圖片

其中 Main 這部分就是網頁的主線程,也就是執行 Event Loop 的部分:

圖片

這塊區域包含了所有 task 執行的流程,每個 task 的調用棧,因為像燃燒的火焰,所以也叫做火焰圖。

鼠標劃到想看的部分,向下拖動,就可以放大那個區域:

圖片

左右拖動可以調整看的位置:

圖片

展示的信息中很多種顏色,這些顏色代表著不同的含義:

灰色就代表宏任務 task:

圖片

藍色的是 html 的 parse,橙色的是瀏覽器內部的 JS:

圖片

紫色是樣式的 reflow、repaint,綠色的部分就是渲染:

圖片

其余的顏色都是用戶 JS 的執行了,那些可以不用區分。

怎么從 Performance 中看出 Event Loop 執行的流程呢?

我們一起來看一下:

你會發現每隔一段時間就會有一個這種任務:

圖片

放大一下是這樣的:

圖片

執行了 Animation Frame 的回調,然后執行了回流重繪,最后執行渲染。

這種任務每隔 16.7 ms 就會執行一次:

圖片

這就是網頁里怎么執行渲染的。

所以說 requestAnimationFrame 的回調是在渲染前執行的,rAF 和渲染構成了一個宏任務。

為什么有的時候會掉幀、卡頓,就是因為阻塞的渲染的宏任務的執行:

圖片

(在 Performance 中寬度代表時間,超過 200ms 就被認為是 Long Task,會被標紅)

我們做性能分析,就是要找到這些 Long Task,然后優化掉它。

那除了 rAF 和渲染,還有哪些是宏任務呢?

看下分析的結果就知道了:

可以看到 requestIdleCallback 的回調是宏任務:

圖片

垃圾回收 GC 是宏任務:

圖片

requestAnimationFrame 的回調是宏任務:

圖片

html 中直接執行的 script 也是宏任務:

圖片

這些需要記么?

不需要,用 Performance 工具看下就知道了。

那微任務是怎么執行的呢?

圖片

可以看到 micro task 只是 task 的一部分,宏任務執行完就會執行所有的微任務。

這就是這個網頁的 Event Loop 執行過程。

當你對這些熟悉了之后,看到下面的火焰圖,你就能分析出一些東西來了:

圖片

中間比較寬的標紅的就是 Long Task,是性能優化的主要目標。

一些比較窄的周期性的 Task 就是 requestAnimationFrame 回調以及 reflow、rapaint 和渲染。

比較長的那個調用棧一般是遞歸,而且遞歸層數特別多。

當你展開看的時候,它也能展示完整的代碼運行流程:

圖片

而如果你打斷點調試,只能看到其中的一個調用棧,這是用 Performance 工具分析代碼流程比 debugger 斷點調試更好的地方。

當你閱讀源碼的時候,也可以通過 Performance 看執行流程的全貌,然后再 debugger 某些具體的流程。

總結

Performance 工具能夠看到網頁的 Event Loop 是怎么運行的,不同的顏色代表不同的含義:

  • 灰色:task
  • 橙色:瀏覽器內部的 JS
  • 藍色:html parse
  • 紫色:reflow、repaint
  • 綠色:渲染

其余的顏色都是用戶自己的 JS。

寬度代表了執行的時間,超過 200ms 就被任務是長任務,需要優化。

長度代表了調用棧深度,一般特別長的都是有遞歸在。

用 Performance 工具可以分析出很多東西:

  • rAF 回調和 reflow、repaint 還有渲染構成一個宏任務,每 16.7 ms 執行一次。
  • rAF 回調、rIC 回調、GC、html 中的 script 等都是宏任務
  • 在任務執行完后,瀏覽器會執行所有微任務,也就是 runAllMicroTasks 部分

Performance 可以看到代碼執行全貌,而斷點調試的調用棧只能看到某一條流程。所以調試代碼的時候可以 Performance 和 Debugger 結合來看。

總之,會用 Performance 工具,你就能深入理解 Event Loop,理清網頁執行的全流程。

責任編輯:武曉燕 來源: 神光的編程秘籍
相關推薦

2022-10-12 07:53:46

并發編程同步工具

2010-06-01 15:25:27

JavaCLASSPATH

2016-12-08 15:36:59

HashMap數據結構hash函數

2020-07-21 08:26:08

SpringSecurity過濾器

2020-09-23 10:00:26

Redis數據庫命令

2019-06-25 10:32:19

UDP編程通信

2017-01-10 08:48:21

2024-02-21 21:14:20

編程語言開發Golang

2025-05-06 00:43:00

MySQL日志文件MIXED 3

2017-08-15 13:05:58

Serverless架構開發運維

2025-06-05 05:51:33

2023-10-19 11:12:15

Netty代碼

2021-02-17 11:25:33

前端JavaScriptthis

2009-09-25 09:14:35

Hibernate日志

2013-09-22 14:57:19

AtWood

2013-10-24 15:23:40

Event Loop

2012-11-22 13:02:24

jQuery插件Web

2021-11-18 09:20:29

Channel語言代碼

2021-04-22 09:58:15

JDK代理動態

2022-04-24 10:42:59

Kubernete容器網絡Linux
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人在线观看网站 | 欧美精品1区| 亚洲一区二区三区久久久 | 热久色| 成人在线免费视频观看 | 精品日本久久久久久久久久 | 国产激情视频 | 久久久精品高清 | 噜噜噜噜狠狠狠7777视频 | 久久久久久国产一区二区三区 | 一级免费a| 亚洲国产一区二区三区在线观看 | 2019精品手机国产品在线 | 国产一区二区视频免费在线观看 | 欧美一区二区三区四区视频 | av在线免费播放 | 亚洲午夜电影 | 97免费在线观看视频 | 日韩成人免费视频 | 99久久久久久99国产精品免 | 国产精品不卡一区 | 欧美午夜一区 | 日韩中文一区二区三区 | 国内精品视频一区二区三区 | 日韩午夜场 | 黄色一级片aaa | 毛片在线看片 | 欧美在线二区 | 天天操精品视频 | 成人性视频免费网站 | 羞羞网站免费 | 日本网站在线看 | 污片在线免费观看 | 久久久久国色av免费观看性色 | 黄视频网址 | 亚洲高清在线观看 | 国产精品久久久久久久久久 | 亚洲成人久久久 | 亚洲播放| 秋霞电影一区二区三区 | 亚洲三区在线 |