日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

前端性能優化:讓你的長任務保持在50ms 內

來源: 責編: 時間:2024-05-16 17:43:13 214觀看
導讀雖然之前有跟大家分享過不少卡頓相關的內容,實際上網頁里卡頓的產生基本上都是由于長任務導致的。當然,能阻塞用戶操作的,我們說的便是主線程上的長任務。瀏覽器中的長任務可能是 JavaScript 的編譯、解析 HTML 和 CSS、

雖然之前有跟大家分享過不少卡頓相關的內容,實際上網頁里卡頓的產生基本上都是由于長任務導致的。當然,能阻塞用戶操作的,我們說的便是主線程上的長任務。Gnw28資訊網——每日最新資訊28at.com

瀏覽器中的長任務可能是 JavaScript 的編譯、解析 HTML 和 CSS、渲染頁面,或者是我們編寫的 JavaScript 中產生了長任務導致。Gnw28資訊網——每日最新資訊28at.com

Gnw28資訊網——每日最新資訊28at.com

Gnw28資訊網——每日最新資訊28at.com

讓你的長任務保持在 50 ms 內

之前在介紹前端性能優化--卡頓篇時,提到可以將大任務進行拆解:Gnw28資訊網——每日最新資訊28at.com

考慮將任務執行耗時控制在 50 ms 左右。每執行完一個任務,如果耗時超過 50 ms,將剩余任務設為異步,放到下一次執行,給到頁面響應用戶操作和更新渲染的時間。Gnw28資訊網——每日最新資訊28at.com

Gnw28資訊網——每日最新資訊28at.com

為什么是 50 毫秒呢?Gnw28資訊網——每日最新資訊28at.com

這個數值并不是隨便寫的,主要來自于 Google 員工開發的 RAIL 模型。Gnw28資訊網——每日最新資訊28at.com

1.RAIL 模型

RAIL 表示 Web 應用生命周期的四個不同方面:響應(Response)、動畫(Animation)、空閑(Idel)和加載(Load)。由于用戶對每種情境有不同的性能預期,因此,系統會根據情境以及關于用戶如何看待延遲的用戶體驗調研來確定效果目標。Gnw28資訊網——每日最新資訊28at.com

人機交互學術研究由來已久,在 Jakob Nielsen’s work on response time limits 中提出三個閾值:Gnw28資訊網——每日最新資訊28at.com

  • 100 毫秒:大概是讓用戶感覺系統立即做出反應的極限,這意味著除了顯示結果之外不需要特殊的反饋
  • 1 秒:大概是用戶思想流保持不間斷的極限,即使用戶會注意到延遲。一般情況下,大于0.1秒小于1.0秒的延遲不需要特殊反饋,但用戶確實失去了直接操作數據的感覺
  • 10 秒:大概是讓用戶的注意力集中在對話上的極限。對于較長的延遲,用戶會希望在等待計算機完成的同時執行其他任務,因此應該向他們提供反饋,指示計算機預計何時完成。如果響應時間可能變化很大,則延遲期間的反饋尤其重要,因為用戶將不知道會發生什么。

在此基礎上,如今機器性能都有大幅度的提升,因此基于用戶的體驗,RAIL 增加了一項:Gnw28資訊網——每日最新資訊28at.com

  • 0-16 ms:大概是用戶感受到流暢的動畫體驗的數值。只要每秒渲染 60 幀,這類動畫就會感覺很流暢,也就是每幀 16 毫秒(包括瀏覽器將新幀繪制到屏幕上所需的時間),讓應用生成一幀大約 10 毫秒

由于這篇文章我們討論的是長任務相關,因此主要考慮生命周期中的響應(Response),目標便是要求 100 毫秒內獲得可見響應。Gnw28資訊網——每日最新資訊28at.com

2.在 50 毫秒內處理事件

RAIL 的目標是在 100 毫秒內完成由用戶輸入發起的轉換,讓用戶感覺互動是瞬時完成的。Gnw28資訊網——每日最新資訊28at.com

目標是 100 毫秒,但是頁面運行時除了輸入處理之外,通常還會執行其他工作,并且這些工作會占用可用于獲得可接受輸入響應的部分時間。Gnw28資訊網——每日最新資訊28at.com

因此,為確保在 100 毫秒內獲得可見響應,RAIL 的準則是在 50 毫秒內處理用戶輸入事件:Gnw28資訊網——每日最新資訊28at.com

為確保在 100 毫秒內獲得可見響應,請在 50 毫秒內處理用戶輸入事件。這適用于大多數輸入,例如點擊按鈕、切換表單控件或啟動動畫。這不適用于輕觸拖動或滾動。Gnw28資訊網——每日最新資訊28at.com

Gnw28資訊網——每日最新資訊28at.com

除了響應之外,RAIL 對其他的生命周期也提出了對應的準則,總體為:Gnw28資訊網——每日最新資訊28at.com

  • 響應(Response):在 50 毫秒內處理事件
  • 動畫(Animation):在 10 毫秒內生成一幀
  • 空閑(Idel):最大限度地延長空閑時間
  • 加載(Load):提交內容并在 5 秒內實現互動

具體每個行為的目標和準則是如何考慮和確定的,大家可以自行學習,這里不再贅述。Gnw28資訊網——每日最新資訊28at.com

長任務優化

網頁加載時,長時間任務可能會占用主線程,使頁面無法響應用戶輸入(即使頁面看起來已就緒)。點擊和點按通常不起作用,因為尚未附加事件監聽器、點擊處理程序等。Gnw28資訊網——每日最新資訊28at.com

基于前面介紹的 RAIL 模型,我們可以將超過 50 毫秒的任務稱之為長任務,即:任何連續不間斷的且主 UI 線程繁忙 50 毫秒及以上的時間區間。Gnw28資訊網——每日最新資訊28at.com

實際上,Chrome 瀏覽器中的 Performance 面板也是如此定義的,我們錄制一段 Performance,當主線程同步執行的任務超過 50 毫秒時,該任務塊會被標記為紅色。Gnw28資訊網——每日最新資訊28at.com

Gnw28資訊網——每日最新資訊28at.com

識別長任務

一般來說,在前端網頁中容易出現的長任務包括:Gnw28資訊網——每日最新資訊28at.com

  • 大型的 JavaScript 代碼加載
  • 解析 HTML 和 CSS
  • DOM 查詢/DOM 操作
  • 運算量較大的 JavaScript 腳本的執行

(1) 使用 Chrome DevtoolsGnw28資訊網——每日最新資訊28at.com

我們可以在 Chrome 開發者工具中,通過錄制 Performance 的方式,手動查找時長超過 50 毫秒的腳本的“長紅/黃色塊”,然后分析這些任務塊的執行內容,來識別出長任務。Gnw28資訊網——每日最新資訊28at.com

我們可以選擇 Bottom-Up 和 Group by Activity 面板來分析這些長任務(關于如何使用 Performance 面板,可以參考分析運行時性能一文):Gnw28資訊網——每日最新資訊28at.com

Gnw28資訊網——每日最新資訊28at.com

比如在上圖中,導致任務耗時較長的原因是一組成本高昂的 DOM 查詢。Gnw28資訊網——每日最新資訊28at.com

(2) 使用 Long Tasks APIGnw28資訊網——每日最新資訊28at.com

我們還可以使用 Long Tasks API 來確定哪些任務導致互動延遲:Gnw28資訊網——每日最新資訊28at.com

new PerformanceObserver(function (list) {  const perfEntries = list.getEntries();  for (let i = 0; i < perfEntries.length; i++) {    // 分析長任務  }}).observe({ entryTypes: ["longtask"] });

(3) 識別大型腳本Gnw28資訊網——每日最新資訊28at.com

大型腳本通常是導致耗時較長的任務的主要原因,我們可以想辦法來識別。Gnw28資訊網——每日最新資訊28at.com

除了使用上述的方法,我們還可以使用PerformanceObserver識別:Gnw28資訊網——每日最新資訊28at.com

new PerformanceObserver((resource) => {    const entries = resource.getEntries();    entries.forEach((entry: PerformanceResourceTiming) => {        // 獲取 JavaScript 資源        if (entry.initiatorType !== 'script') return;        const startTime = new Date().getTime();                window.requestAnimationFrame(() => {          // JavaScript 資源加載完成          const endTime = new Date().getTime();          // 如果此時耗時大于 50 ms,則可任務出現了長任務          const isLongTask = endTime - startTime > 50;        });    });}).observe({entryTypes: ['resource']});

這種方式我們還可以通過entry.name拿到對應的加載資源,針對性地進行處理。Gnw28資訊網——每日最新資訊28at.com

(4) 自定義性能指標Gnw28資訊網——每日最新資訊28at.com

除此之外,我們還可以通過在代碼中埋點,自行計算執行耗時,從而針對可預見的場景識別出長任務:Gnw28資訊網——每日最新資訊28at.com

// 可預見的大任務執行前打點performance.mark('bigTask:start');await doBigTask();// 執行后打點performance.mark('bigTask:end');// 測量該任務performance.measure('bigTask', 'bigTask:start', 'bigTask:end');

再配合PerformanceObserver獲取對應的性能數據,大于 50 毫秒則可以判斷為長任務、Gnw28資訊網——每日最新資訊28at.com

優化長任務

發現長任務之后,我們就可以進行對應的長任務優化。Gnw28資訊網——每日最新資訊28at.com

1.過大的 JavaScript 腳本

大型腳本通常是導致耗時較長的任務的主要原因,尤其是首屏加載時盡量避免加載不必要的代碼。Gnw28資訊網——每日最新資訊28at.com

我們可以考慮拆分這些腳本:Gnw28資訊網——每日最新資訊28at.com

  • 首屏加載,僅加載必要的最小 JavaScript 代碼。
  • 其他 JavaScript 代碼進行模塊化,進行分包加載。
  • 通過預加載、閑時加載等方式,完成剩余所需模塊的代碼加載。

拆分 JavaScript 腳本,使得用戶打開頁面時,只發送初始路由所需的代碼。這樣可以最大限度地減少需要解析和編譯的腳本量,從而縮短網頁加載時,也有助于提高 First Input Delay (FID) 和 Interaction to Next Paint (INP) 時間。Gnw28資訊網——每日最新資訊28at.com

有很多工具可以幫助我們完成這項工作:Gnw28資訊網——每日最新資訊28at.com

  • webpack
  • Parcel
  • Rollup

這些熱門的模塊打包器,都支持動態加載的方式來拆分 JavaScript 腳本。我們甚至可以限制每個構建模塊的大小,來防止某個模塊的 JavaScript 腳本過大,具體的使用方式大家可以自行搜索。Gnw28資訊網——每日最新資訊28at.com

2.過長的 JavaScript 執行任務

主線程一次只能處理一個任務。如果任務的延時時間超過某一點(確切來說是 50 毫秒),則會被歸類為耗時較長的任務。Gnw28資訊網——每日最新資訊28at.com

對于這種過長的執行任務,優化方案也十分直接:任務拆分,直觀來看就是這樣:Gnw28資訊網——每日最新資訊28at.com

Gnw28資訊網——每日最新資訊28at.com

一般來說,任務拆分可以分為兩種:Gnw28資訊網——每日最新資訊28at.com

  • 串行執行的不同執行任務。
  • 單個超大的執行任務。

(1) 串行任務的拆分Gnw28資訊網——每日最新資訊28at.com

對于串行執行的不同任務,可以將不同任務的調用從同步改成異步即可,比如 Optimize long tasks 這篇文章中詳細介紹的:Gnw28資訊網——每日最新資訊28at.com

saveSettings()的函數,該函數會調用五個函數來完成某些工作:Gnw28資訊網——每日最新資訊28at.com

function saveSettings () {  validateForm();  showSpinner();  saveToDatabase();  updateUI();  sendAnalytics();}

Gnw28資訊網——每日最新資訊28at.com

對這些串行任務進行拆分有很多種方式,比如:Gnw28資訊網——每日最新資訊28at.com

  • 使用setTimeOut()/postTask()實現異步
  • 自行實現任務管理器,管理串行任務執行,每執行一個任務后釋放主線程,再執行下一個任務(還需考慮優先級執行任務)

具體的代碼可以參考 Optimize long tasks 該文章,理想的優化效果為:Gnw28資訊網——每日最新資訊28at.com

Gnw28資訊網——每日最新資訊28at.com

(2) 單個超大任務的拆分Gnw28資訊網——每日最新資訊28at.com

有時候我們的應用中需要做大量的運算,比如對上百萬個數據做一系列的計算,此時我們可以考慮進行分批拆分。Gnw28資訊網——每日最新資訊28at.com

拆分的時候需要注意幾個事情:Gnw28資訊網——每日最新資訊28at.com

  • 盡量將每個小任務拆成 50 毫秒左右的執行時間。
  • 大任務分批執行,會由同步執行變為異步執行,需要考慮中間態(是否有新的任務插入,是否會重復執行)。

之前在介紹復雜渲染引擎的時候,有詳細講解使用分批計算的方法進行性能優化,具體可以參考《復雜渲染引擎架構與設計--5.分片計算》一文。Gnw28資訊網——每日最新資訊28at.com

結束語

對于大型復雜的前端應用來說,卡頓和長任務都是家常便飯。Gnw28資訊網——每日最新資訊28at.com

性能優化沒有捷徑,有的都是一步步定位,一點點分析,一處處解決。每一個問題都是獨立的問題,但我們還可以識別它們的共性,提供更高效的解決路徑。Gnw28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-88566-0.html前端性能優化:讓你的長任務保持在50ms 內

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 一個小技巧,寫出絲滑的 Python 代碼

下一篇: 使用Cargo的特性來優化你的Rust項目

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美在线免费观看| 国产精品永久免费| 性伦欧美刺激片在线观看| 午夜精品久久久| 香蕉久久久久久久av网站| 午夜一区不卡| 欧美一区二区三区在线观看| 久久亚洲精品一区| 欧美日韩一二三区| 国产欧美精品在线| 在线欧美日韩| 亚洲一区二区精品视频| 欧美伊人久久久久久午夜久久久久| 久久久久久久欧美精品| 欧美区国产区| 国产在线不卡| 亚洲免费观看在线观看| 亚洲欧美日韩一区二区三区在线观看| 久久久久综合| 欧美日韩一区二区三区四区五区| 国产色综合天天综合网| 亚洲国内自拍| 午夜精品一区二区三区在线| 欧美不卡视频一区| 国产精品自拍三区| 亚洲理伦电影| 久久精品国产欧美亚洲人人爽 | 免费视频最近日韩| 国产精品高清在线观看| 韩日精品视频一区| 制服诱惑一区二区| 久热综合在线亚洲精品| 国产精品激情| 亚洲国内自拍| 久久久久久黄| 国产精品色在线| 亚洲精品免费网站| 久久精品国产99国产精品澳门 | 亚洲精品乱码| 久久久久国产一区二区三区| 国产精品va在线| 亚洲激情视频在线观看| 99精品国产在热久久| 久久久久国产精品人| 欧美久久久久中文字幕| 国产欧美日本一区视频| 亚洲毛片av在线| 久久亚洲国产精品日日av夜夜| 国产精品久久久久久久久动漫| 亚洲精华国产欧美| 久久青草欧美一区二区三区| 国产精品乱码人人做人人爱| 亚洲精品少妇30p| 久久精品视频va| 亚洲精品免费网站| 久久se精品一区二区| 国产精品久久久久久久久果冻传媒| 在线免费观看日韩欧美| 久久精品首页| 欧美日韩亚洲在线| 亚洲国产精品一区二区三区| 久久精品成人一区二区三区| 国产精品久久久爽爽爽麻豆色哟哟| 亚洲精品之草原avav久久| 久久影视三级福利片| 国产九九视频一区二区三区| 一区二区三区欧美日韩| 欧美人在线视频| 日韩视频精品在线| 欧美女主播在线| 亚洲精品一区二区三区在线观看| 免费成人网www| 在线高清一区| 老色鬼久久亚洲一区二区| 黄色成人av在线| 久久久久女教师免费一区| 国产一区二区三区久久久| 欧美一区二区三区四区视频| 国产乱理伦片在线观看夜一区| 亚洲综合精品四区| 欧美日韩综合一区| 亚洲美女黄色片| 欧美日韩免费高清一区色橹橹| 亚洲日韩欧美视频| 欧美日韩国产精品专区| 99热免费精品| 国产精品扒开腿做爽爽爽视频| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美午夜影院| 亚洲欧美在线x视频| 国产日韩精品在线播放| 久久国产精品72免费观看| 国内成人精品2018免费看| 久久亚洲一区二区| 亚洲激情视频在线观看| 亚洲欧美综合v| 午夜激情亚洲| 欧美日韩亚洲综合| 一区二区三区精品久久久| 欧美日韩播放| 亚洲综合首页| 国产欧美日韩在线播放| 久久gogo国模啪啪人体图| 激情久久一区| 欧美 日韩 国产一区二区在线视频 | 亚洲裸体在线观看| 欧美日本高清视频| 一区二区三区免费在线观看| 国产精品一区二区久激情瑜伽| 欧美尤物一区| 一色屋精品视频在线观看网站| 欧美~级网站不卡| aa亚洲婷婷| 国产精品一区二区在线观看不卡| 久久久久久一区| 亚洲精品乱码久久久久久日本蜜臀 | 美国三级日本三级久久99| 亚洲国产美女精品久久久久∴| 欧美人与禽性xxxxx杂性| 亚洲午夜视频| 韩国一区二区在线观看| 欧美激情成人在线| 亚洲综合丁香| 一区二区三区在线视频观看 | 韩日欧美一区二区三区| 免费美女久久99| 亚洲午夜91| 激情久久久久久| 欧美日韩aaaaa| 欧美一区二区三区在线播放| 亚洲高清不卡在线| 欧美视频1区| 久久一区中文字幕| 一本大道久久精品懂色aⅴ| 国产欧美一区在线| 欧美高清在线视频| 性色一区二区| 亚洲理论在线| 欧美日韩中文字幕| 久久福利精品| 日韩视频在线一区| 国产一区二区日韩精品| 欧美日韩免费视频| 久久―日本道色综合久久| 中文精品视频一区二区在线观看| 国内精品久久久久影院色| 欧美激情第一页xxx| 久久av一区二区三区| 亚洲久色影视| 一区在线影院| 久久爱另类一区二区小说| 国产精品亚洲网站| 欧美在线关看| 99精品欧美一区二区蜜桃免费| 国产欧美精品一区二区色综合| 欧美国产欧美综合| 久久爱www久久做| 一本色道婷婷久久欧美| 影音先锋欧美精品| 国产精品综合不卡av| 女女同性精品视频| 久久精品亚洲热| 亚洲一区二区三区久久| 亚洲人成网站影音先锋播放| 国产精品久久久久久亚洲毛片| 欧美不卡在线| 99热这里只有精品8| 亚洲亚洲精品在线观看| 亚洲欧洲一二三| 欧美日本精品一区二区三区| 亚洲香蕉在线观看| 亚洲电影一级黄| 国产日韩在线亚洲字幕中文| 欧美激情小视频| 久久人人爽人人爽| 欧美一区二区三区日韩| 在线天堂一区av电影| 亚洲激情啪啪| 尤物在线观看一区| 国产深夜精品福利| 国产精品久久久久国产a级| 欧美激情无毛| 免费成人性网站| 久久久久国产精品一区三寸| 亚洲免费中文| 樱桃国产成人精品视频| 亚洲国产精品久久久久婷婷884| 欧美日韩视频不卡| 欧美a级理论片| 久久视频在线视频| 国产精品久久午夜| 欧美一区午夜精品| 国产精品99久久久久久久vr| 亚洲激情综合| 91久久夜色精品国产九色| 激情欧美一区二区三区在线观看 | 美女啪啪无遮挡免费久久网站| 欧美一区二区三区视频在线| 亚洲欧美成人一区二区三区| 亚洲网站视频福利| 亚洲自拍偷拍麻豆| 亚洲一区二区av电影| 亚洲一区久久| 午夜精品在线视频|