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

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

React 中,用到的幾種淺比較方式及其比較成本科普

來源: 責編: 時間:2024-04-22 09:12:16 244觀看
導讀開發中的絕大多數時候,我們并不需要關注 React 項目的性能問題。雖然我們在前面幾個章節中,也花了幾篇文章來分析如何優化 React 的性能體驗,但是這些知識點在開發過程中能用到的機會其實比較少。面試的時候用得比較多。

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

開發中的絕大多數時候,我們并不需要關注 React 項目的性能問題。雖然我們在前面幾個章節中,也花了幾篇文章來分析如何優化 React 的性能體驗,但是這些知識點在開發過程中能用到的機會其實比較少。面試的時候用得比較多。TRm28資訊網——每日最新資訊28at.com

但是,當你的項目遇到性能瓶頸,如何優化性能就變得非常重要。當然,我們前面幾篇文章已經把性能優化的方式和方法說得非常清晰了,大家可以回顧一下。這篇文章我們要分享的重點是,當我采用不同的方式優化之后,代碼邏輯執行所要付出的代價到底如何。TRm28資訊網——每日最新資訊28at.com

例如,當我們得知 React 的 DIFF 是全量比較的時候,可能第一個反應就是覺得他性能差。但是具體性能差到什么程度呢?有沒有一個具體的數據來支撐?不確定,這只是一種主觀感受。優化之后的性能到底強不強呢,也不敢肯定。TRm28資訊網——每日最新資訊28at.com

因此,這篇文章主要給大家介紹幾種 react 在 diff 過程中用到的比較方式,以及當這幾種方式大量執行時,執行所要花費的時間。TRm28資訊網——每日最新資訊28at.com

一、對象直接比較

又稱為全等比較,這是一種成本最低的比較方式。在 React 中,state 與 props 的比較都會用到這樣的方式。TRm28資訊網——每日最新資訊28at.com

var prevProps = {}var nextProps = {}if (prevProps === nextProps) {  ...}

那么,這種比較方式的成本有多低呢?我們來寫一個循環簡單驗證一下。分別看看比較一萬次需要多長時間。TRm28資訊網——每日最新資訊28at.com

var markTime = performance.now()var prev = {}var next = {}for(var i = 0; i <= 10000; i++) {  if (prev === next) {    console.log('相等')  }}var endTime = performance.now()console.log(endTime - markTime)

執行結果會有小范圍波動,展示出來的結果都是取的多次執行的平均值,或者出現次數最多的執行結果。比如本案例執行,用時最短的是 0.3 ms,用時最長的是 0.8 ms。TRm28資訊網——每日最新資訊28at.com

可以看到,對比一萬次,用時約  0.6ms。TRm28資訊網——每日最新資訊28at.com

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

對比一百萬次,用時約 6.4ms。TRm28資訊網——每日最新資訊28at.com

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

通常情況下,我們項目的規模應該很難超過一萬次,控制得好一點,一般都在 1000 次以內。多一點也應該在 5000 次以內,5000 次用這種方式的對比只需要 0.3ms 左右。TRm28資訊網——每日最新資訊28at.com

二、Object.is

Object.is 是一種與全等比較相似但不同的比較方式,他們的區別就在于處理帶符號的 0 和 NaN 時結果不一樣。TRm28資訊網——每日最新資訊28at.com

+0 === -0 // trueObject.is(+0, -0) // falseNaN === NaN // falseObject.is(NaN, NaN) // true

React 源碼里為 Object.is 做了兼容處理,因此多了一點判斷,所以他的性能上會比全等要差一些。TRm28資訊網——每日最新資訊28at.com

function is(x, y) {  return (    (x === y && (x !== 0 || 1 / x === 1 / y)) || (x !== x && y !== y) // eslint-disable-line no-self-compare  );}const objectIs =  typeof Object.is === 'function' ? Object.is : is;

那么差多少呢?我們先寫一個邏輯來看一下執行一萬次比較需要多久。TRm28資訊網——每日最新資訊28at.com

function is(x, y) {  return (    (x === y && (x !== 0 || 1 / x === 1 / y)) || (x !== x && y !== y) // eslint-disable-line no-self-compare  );}const objectIs =  typeof Object.is === 'function' ? Object.is : is;var markTime = performance.now()var prev = {}var next = {}for(var i = 0; i <= 10000; i++) {  if (objectIs(prev, next)) {    console.log('相等')  }}var endTime = performance.now()console.log(endTime - markTime)

執行結果如下,大概是 0.8ms。TRm28資訊網——每日最新資訊28at.com

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

執行一百萬次,用時約 11.4ms。TRm28資訊網——每日最新資訊28at.com

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

那么我們的項目規模在 5000 次比較以內的話,用時估計在 0.4ms 左右,比全等比較多用了 0.1ms。TRm28資訊網——每日最新資訊28at.com

三、shallowEqual

這種淺比較的成本就稍微大一些,例如,當我們對子組件使用了 memo 包裹之后,那么在 diff 過程中,對于 props 的比較方式就會轉變成這樣方式,他們會遍歷判斷 props 第一層每一項子屬性是否相等。TRm28資訊網——每日最新資訊28at.com

function shallowEqual(objA: mixed, objB: mixed): boolean {  if (is(objA, objB)) {    return true;  }  if (    typeof objA !== 'object' ||    objA === null ||    typeof objB !== 'object' ||    objB === null  ) {    return false;  }  const keysA = Object.keys(objA);  const keysB = Object.keys(objB);  if (keysA.length !== keysB.length) {    return false;  }  // Test for A's keys different from B.  for (let i = 0; i < keysA.length; i++) {    const currentKey = keysA[i];    if (      !hasOwnProperty.call(objB, currentKey) ||      !is(objA[currentKey], objB[currentKey])    ) {      return false;    }  }  return true;}

首先,這種比較方式在 React 中出現的次數非常的少,只有我們手動新增了 memo 之后才會進行這種比較,因此,我們測試的時候,先以 1000 次為例看看結果。TRm28資訊網——每日最新資訊28at.com

我們定義兩個數量稍微多一點的 props 對象,他們最有最后一項不相同,因此比較的次數會拉滿。TRm28資訊網——每日最新資訊28at.com

var prev = {a:1, b: 1, c: 1, d: 1, e: 1, f: 1, g: 1}var next = {a:1, b: 1, c: 1, d: 1, e: 1, f: 1, g: 2}

完整代碼如下:TRm28資訊網——每日最新資訊28at.com

function is(x, y) {  return (    (x === y && (x !== 0 || 1 / x === 1 / y)) || (x !== x && y !== y) // eslint-disable-line no-self-compare  );}const objectIs =  typeof Object.is === 'function' ? Object.is : is;function shallowEqual(objA, objB) {  if (is(objA, objB)) {    return true;  }  if (    typeof objA !== 'object' ||    objA === null ||    typeof objB !== 'object' ||    objB === null  ) {    return false;  }  const keysA = Object.keys(objA);  const keysB = Object.keys(objB);  if (keysA.length !== keysB.length) {    return false;  }  // Test for A's keys different from B.  for (let i = 0; i < keysA.length; i++) {    const currentKey = keysA[i];    if (      !Object.hasOwnProperty.call(objB, currentKey) ||      !is(objA[currentKey], objB[currentKey])    ) {      return false;    }  }  return true;}var markTime = performance.now()var prev = {a:1, b: 1, c: 1, d: 1, e: 1, f: 1, g: 1}var next = {a:1, b: 1, c: 1, d: 1, e: 1, f: 1, g: 2}for(var i = 0; i <= 1000; i++) {  if (shallowEqual(prev, next)) {    console.log('相等')  }}var endTime = performance.now()console.log(endTime - markTime)

1000 次比較結果耗時如下,約為 1.4ms。TRm28資訊網——每日最新資訊28at.com

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

5000 次比較結果耗時如下,約為 3.6ms。TRm28資訊網——每日最新資訊28at.com

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

10000 次比較結果耗時如下,約為 6.6 ms。TRm28資訊網——每日最新資訊28at.com

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

這里我們可以做一個簡單的調整,讓對比耗時直接少一半。那就是把唯一的變化量,寫到前面來,如圖所示,耗時只用了 3.1ms。TRm28資訊網——每日最新資訊28at.com

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

運用到實踐中,就是把 props 中的變量屬性,盡量寫在前面,能夠大幅度提高對比性能。TRm28資訊網——每日最新資訊28at.com

四、總結

次數
TRm28資訊網——每日最新資訊28at.com

全等
TRm28資訊網——每日最新資訊28at.com

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

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

五千
TRm28資訊網——每日最新資訊28at.com

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

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

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

一萬
TRm28資訊網——每日最新資訊28at.com

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

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

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

百萬
TRm28資訊網——每日最新資訊28at.com

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

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

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

因此我們從測試結果中看到,全量 diff 并不可怕,如果你對性能優化的理解非常到位,那么能你的項目中,全量 diff 所花費的時間只有 0.幾ms,理論的極限性能就是只在你更新的組件里對比出差異,執行 re-render。TRm28資訊網——每日最新資訊28at.com

當然,由于對于 React 內部機制的理解程度不同,會導致一些差異,例如有些同學的項目中,會執行過多的冗余 re-render。從而導致在大型項目中性能體驗可能出現問題。那么這種情況下,也不用擔心,有一種超級笨辦法,那就是在項目中,結合我們剛才在 shallowEqual 中提高的優化方案,無腦使用 useCallback 與 memo,你的項目性能就能得到明顯的提高,當然,這個方案不夠優雅但是管用。TRm28資訊網——每日最新資訊28at.com

可以看出,React 性能優化最重要的手段非常簡單:就是控制當前渲染內容的節點規模。TRm28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-84462-0.htmlReact 中,用到的幾種淺比較方式及其比較成本科普

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

上一篇: 利用RSA加密打造強大License驗證,確保軟件正版合法運行

下一篇: 針對尺寸單位,為什么不應該使用 px 作為尺寸單位?以及最佳實踐!

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美一区二区三区视频免费播放| 亚洲福利在线看| 欧美日韩成人一区二区三区| 欧美日韩精品在线视频| 国产精品欧美风情| 国产亚洲亚洲| 亚洲欧洲日本mm| 亚洲一区二区免费看| 久久精品首页| 欧美精品在线观看播放| 国产精品久久久久久模特| 国产一区日韩二区欧美三区| 亚洲国产精品久久人人爱蜜臀 | 久久激情网站| 免费成人av在线| 国产精品国产三级国产aⅴ9色| 国产综合精品| 一本色道久久99精品综合| 久久精品99| 欧美日韩国产综合新一区| 国产日产亚洲精品| 亚洲毛片在线免费观看| 欧美在线黄色| 欧美日韩一区视频| 狠狠色综合色区| 亚洲一区二区三区在线看 | 国产精品一区免费视频| 亚洲国产精品一区二区第四页av| 亚洲一二三级电影| 久久综合九九| 国产精品久久久久久久一区探花| 在线国产精品一区| 香蕉久久国产| 欧美色欧美亚洲高清在线视频| 国产曰批免费观看久久久| 一区二区三区精品视频| 蜜桃精品久久久久久久免费影院| 国产精品亚洲一区| 99视频精品全部免费在线| 久久午夜电影| 国产精自产拍久久久久久蜜| 亚洲激情视频| 欧美资源在线| 国产精品高潮呻吟久久av黑人| 亚洲电影在线观看| 性做久久久久久久免费看| 欧美日韩一区二区视频在线| 在线免费观看视频一区| 欧美在线地址| 国产精品久久久久久久久动漫| 亚洲精品乱码久久久久久日本蜜臀| 久久黄色级2电影| 国产精品免费看久久久香蕉| 亚洲精品自在久久| 男人插女人欧美| 国产综合在线看| 午夜在线视频观看日韩17c| 欧美午夜视频在线观看| 日韩视频欧美视频| 欧美成人视屏| 在线观看一区二区视频| 欧美伊人久久| 国产精品视频一二| 亚洲一品av免费观看| 欧美日韩免费观看一区二区三区| 亚洲人成网站在线观看播放| 麻豆成人在线| 激情综合五月天| 久久国产精品久久久| 国产伦精品一区二区三区免费迷| 亚洲一区二区三区在线视频 | 亚洲高清视频一区| 久久亚洲欧美| 伊人久久亚洲美女图片| 久久精品噜噜噜成人av农村| 国产欧美高清| 欧美一级在线视频| 国产三级精品在线不卡| 欧美诱惑福利视频| 国产日韩亚洲| 久久精品在线免费观看| 韩国视频理论视频久久| 久久精品人人做人人综合| 国产一区二区三区免费在线观看| 欧美在线精品一区| 国产在线观看一区| 久久久久亚洲综合| 亚洲第一中文字幕| 激情文学综合丁香| 欧美在线资源| 狠狠久久亚洲欧美| 久久综合中文| 91久久精品美女高潮| 免费成人在线观看视频| 亚洲国产欧美在线人成| 欧美精品 日韩| 一本色道久久综合精品竹菊 | 欧美成人第一页| 亚洲理论在线观看| 欧美日韩中文字幕综合视频 | 香蕉成人啪国产精品视频综合网| 国产精品自拍小视频| 欧美一级电影久久| 黄色在线一区| 欧美国产日韩一区二区在线观看| 91久久极品少妇xxxxⅹ软件| 欧美精品色网| 亚洲深夜福利| 国产日韩高清一区二区三区在线| 久久九九精品99国产精品| 亚洲国产精品久久久久婷婷884| 欧美精品免费看| 亚洲午夜视频在线观看| 国产视频精品xxxx| 麻豆精品国产91久久久久久| 亚洲免费观看在线视频| 国产精品久久久久久久久久久久久 | 亚洲第一精品在线| 欧美男人的天堂| 午夜精品偷拍| 影音国产精品| 欧美日韩亚洲综合一区| 亚洲欧美一级二级三级| 在线观看视频一区二区| 欧美日韩调教| 久久激情五月激情| 亚洲裸体视频| 国产欧美综合在线| 欧美精品免费播放| 欧美中文在线字幕| 亚洲免费av片| 国产在线精品一区二区夜色| 欧美精品aa| 久久精品国产视频| aa日韩免费精品视频一| 国产欧美一区二区三区久久人妖| 免费一级欧美片在线播放| 亚洲婷婷综合久久一本伊一区| 很黄很黄激情成人| 欧美性大战久久久久久久蜜臀 | 欧美久久一区| 欧美一区二区三区在线看| 亚洲人体影院| 国产一区二区久久| 欧美日产在线观看| 久久激情视频免费观看| 亚洲伦理久久| 韩日欧美一区二区三区| 国产精品第一区| 男人插女人欧美| 篠田优中文在线播放第一区| 亚洲国产一成人久久精品| 国产精品亚洲一区| 欧美日韩精品| 猛男gaygay欧美视频| 午夜视频在线观看一区二区三区| 亚洲精品欧美| 狠狠狠色丁香婷婷综合久久五月 | 国产精品九九| 欧美成人一二三| 欧美在线视频日韩| 亚洲深夜福利视频| 亚洲精品乱码久久久久久按摩观| 国内外成人在线视频| 国产精品久久久免费| 欧美激情1区| 久久嫩草精品久久久久| 午夜精品国产更新| 亚洲最黄网站| 亚洲日本va午夜在线影院| 永久555www成人免费| 国产精品永久| 欧美午夜一区二区三区免费大片 | 欧美激情a∨在线视频播放| 久久免费视频这里只有精品| 亚洲欧美国产va在线影院| 99re66热这里只有精品4| 亚洲高清在线| 一区二区三区在线视频观看| 国产欧美一区二区精品性色| 国产精品啊啊啊| 欧美日韩一区二区高清| 欧美激情视频一区二区三区不卡| 老鸭窝91久久精品色噜噜导演| 久久精彩视频| 久久成人18免费观看| 小黄鸭精品aⅴ导航网站入口| 亚洲视频一区在线观看| 中文国产成人精品| 一区二区欧美视频| 一区二区成人精品| 日韩小视频在线观看| 亚洲欧洲另类国产综合| 91久久综合| 亚洲破处大片| 亚洲精品在线视频| 日韩视频二区| 99视频在线观看一区三区| 日韩天堂av| 一本色道久久综合亚洲91| 99在线精品观看| 一区二区三区四区在线| 亚洲神马久久| 亚洲免费影视第一页|