gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

什么是EventLoop?怎么測試Node或頁面的性能

Event Loop 機制大家應該都有了解。本文利用 EventLoop 去做一個有趣的檢測node或頁面性能的代碼,順便介紹了一下EventLoop,希望對大家有所幫助!

什么是EventLoop?怎么測試Node或頁面的性能

Event Loop

Event Loop 機制大家應該都有了解。我先重復總結(jié)一下。

Node.js 和 Javascript 的 Event Loop 不太一樣,直觀上是多了 setImmediateprocess.nextTick 兩個 API。其次是由于運行時不一樣,Html Standrad 里面會考慮多頁面、DOM操作等不同來源會有不同的 task queue 。而 Node.js Event Loop 中需要考慮的沒這么多。

按照我的理解,雙方在概念上是一致的,可以如此概括(或者看這里):

  • task queue 任務隊列。一些事件等會被定義為任務,很多時候會被稱為 MacroTask(宏任務)與 MicroTask 進行對應。每次會獲取隊頭的 task 進行執(zhí)行。

  • microtask queue 微任務隊列。會有一個微任務隊列,一個 Task 內(nèi)一般會執(zhí)行清空微任務隊列。

  • 如此往復。

性能測量

在上面的了解之后,有一個簡單的對性能進行測量的方法:每秒內(nèi)完成了多少次 Event Loop 循環(huán),或者說執(zhí)行了多少個 MacroTask,這樣我們大致就能知道代碼中同步的代碼的執(zhí)行情況。

測試函數(shù)

class MacroTaskChecker {     constructor(macroTaskDispatcher, count = 1000, cb = () => { }) {         this.macroTaskDispatcher = macroTaskDispatcher         this.COUNT = count         this.cb = cb     }     start(cb) {         this.cb = cb || this.cb         this.stop = false         const scope = () => {             let count = this.COUNT             const startTime = performance.now()             const fn = () => {                 count--                 if (count > 0) this.macroTaskDispatcher(fn)                 else {                     const endTime = performance.now()                     // 執(zhí)行 COUNT 次宏任務之后 計算平均每秒執(zhí)行了多少個                     this.cb({                         avg: this.COUNT / (endTime - startTime) * 1000,                         timestamp: endTime                     })                     !this.stop && this.macroTaskDispatcher(scope)                 }             }             this.macroTaskDispatcher(fn)         }         scope()     }      stop() {         this.stop = true     } }
登錄后復制

之后,執(zhí)行一些死循環(huán)去測試是否能檢測到密集同步代碼執(zhí)行。

function meaninglessRun(time) {     console.time('meaninglessRun')     for (let i = time; i--; i > 0) {         // do nothing     }     console.timeEnd('meaninglessRun') }  setTimeout(() => {     meaninglessRun(1000 * 1000 * 1000) }, 1000 * 5)  setTimeout(() => {     checker.stop()     console.log('stop') }, 1000 * 20)
登錄后復制

setTimeout

const checker = new MacroTaskChecker(setTimeout, 100)  checker.start(v => console.log(`time: ${v.timestamp.toFixed(2)} avg: ${v.avg.toFixed(2)}`))
登錄后復制

從輸出中能明顯看到同步阻塞的時候avg是下降的。不過在 browser 和 node.js 上測試兩邊會有明顯差距?!鞠嚓P教程推薦:nodejs視頻教程】

// node.js time: 4837.47 avg: 825.14 time: 4958.18 avg: 829.83 meaninglessRun: 918.626ms time: 6001.69 avg: 95.95 time: 6125.72 avg: 817.18 time: 6285.07 avg: 635.16 // browser time: 153529.90 avg: 205.21 time: 154023.40 avg: 204.46 meaninglessRun: 924.463ms time: 155424.00 avg: 71.62 time: 155908.80 avg: 208.29 time: 156383.70 avg: 213.04
登錄后復制

雖然達成我們的目的,但是使用 setTimeout 是不完全能準確記錄下每一個任務的。根據(jù) HTML Standrad 和 MDN 的說法,setTimeout 最少的會等待4ms。從這個角度看 browser avg * 4ms

approx

1000ms。而 node.js 應該是沒有遵循 browser 那邊的約定,但是也沒有執(zhí)行到記錄每一個loop。

setImmediate

如果使用 node.js 的 setImmediate

const checker = new MacroTaskChecker(setImmediate, 1000 * 10)
登錄后復制

可以看到執(zhí)行次數(shù)大概高出 Node.js setTimeout 一個量級:

time: 4839.71 avg: 59271.54 time: 5032.99 avg: 51778.84 meaninglessRun: 922.182ms time: 6122.44 avg: 9179.95 time: 6338.32 avg: 46351.38 time: 6536.66 avg: 50459.77
登錄后復制

按照 Node.js 文檔中的解釋,setImmediate 會在每一個 loop (phase) 的 check 階段執(zhí)行。使用 setImmediate 應該是能準確記錄每一次 Loop 的。我這臺機器大概是 40000 到 60000 之間的循環(huán)次數(shù)。

window.postMessage

在 browser 上由于沒有 setImmediate 我們可以按照 MDN 上的指引使用 window.postMessage 實現(xiàn)一個。

如果想在瀏覽器中實現(xiàn) 0ms 延時的定時器,你可以參考這里所說的 window.postMessage()

const fns = [] window.addEventListener("message", () => {     const currentFns = [...fns]     fns.length = 0     currentFns.forEach(fn => fn()) }, true); function messageChannelMacroTaskDispatcher(fn) {     fns.push(fn)     window.postMessage(1) }
登錄后復制

可以看到和 node.js setImmediate 量級是一致的。

time: 78769.70 avg: 51759.83 time: 78975.60 avg: 48614.49 meaninglessRun: 921.143 ms time: 80111.50 avg: 8805.14 time: 80327.00 avg: 46425.26 time: 80539.10 avg: 47169.81
登錄后復制

MessageChannel

browser

理論上 browser 使用 MessageChannel 應該也是可以的,還避免了無效的消息被其他 window.addEventListener("message", handler) 接收:

const { port1, port2 } = new MessageChannel(); const fns = [] port1.onmessage = () => {     const currentFns = [...fns]     fns.length = 0     currentFns.forEach(fn => fn()) }; function messageChannelMacroTaskDispatcher(fn) {     fns.push(fn)     port2.postMessage(1) }
登錄后復制

不是很懂為啥會比 window.postMessage 頻繁一點,同時啟動兩個 checker 的話可以看到 log 是成對出現(xiàn)的,也就是說一個loop內(nèi)大家都只執(zhí)行了一次。我猜測是 window.postMessage 的實現(xiàn)方式消耗會大一些。

time: 54974.80 avg: 68823.12 time: 55121.00 avg: 68493.15 meaninglessRun: 925.160888671875 ms time: 56204.60 avg: 9229.35 time: 56353.00 avg: 67430.88 time: 56503.10 avg: 66666.67 // 一起執(zhí)行 wp=window.postMessage mc=MessageChannel wp time: 43307.90 avg: 25169.90 mc time: 43678.40 avg: 27005.13 wp time: 43678.60 avg: 26990.55 mc time: 44065.80 avg: 25833.12 wp time: 44066.00 avg: 25819.78 mc time: 44458.40 avg: 25484.20
登錄后復制

node

在 node.js 上也有 MessageChannel ,是否也可以用來測量loop次數(shù)呢?

mc time: 460.99 avg: 353930.80 mc time: 489.52 avg: 355088.11 mc time: 520.30 avg: 326384.64 mc time: 551.78 avg: 320427.29
登錄后復制

量級很不正常。理論上不應該超過 setImmediate 的。如果同時啟動 setImmediatesetTimeout 的 checker:

... (messagechannel) time: 1231.10 avg: 355569.31 (messagechannel) time: 1260.14 avg: 345825.77 (setImmediate) time: 1269.95 avg: 339.27 (setTimeout) time: 1270.09 avg: 339.13 (messagechannel) time: 1293.80 avg: 298141.74 (messagechannel) time: 1322.50 avg: 349939.04 ...
登錄后復制

很明顯跟不是宏任務了。我猜測 MessageChannel 在 node.js 被歸入到跟 socket 等同級別了,就是超出閾值之后的任務會移動到下一個loop中。

總結(jié)

使用這種方式去檢測性能還挺有趣的,正式使用的話這個指標感覺過于不穩(wěn)定(即使什么都沒做都會有20%-30%的振動)。推薦和其他正經(jīng)的辦法(比如 performance 等)結(jié)合。

同時這種方式非常有可能影響正常的 Event Loop,比如 Node.js 中會有一個 pull 的階段,在執(zhí)行完全部微任務后,沒有任何 timer 的話是會停留在這個階段,準備馬上執(zhí)行下一個出現(xiàn)的微任務。

順便復習了下 Event Loop。沒想到的是 MessageChannel 在兩邊的差距居然有這么大。

贊(0)
分享到: 更多 (0)
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
密臀av一区二区三区| 操bbb操bbb| 国产精品999视频| 亚洲色图欧美自拍| 亚洲一级免费观看| 中文久久久久久| 欧美视频第三页| 国产视频在线视频| 中文字幕第36页| av在线无限看| 中文字幕 日韩 欧美| 99re精彩视频| 欧美爱爱视频网站| 久久精品在线免费视频| 欧美高清中文字幕| 成人毛片视频网站| 亚洲国产精品毛片av不卡在线| 欧美 日韩精品| 国产三级国产精品国产专区50| 亚洲色图 在线视频| 一区二区三区 日韩| 三级性生活视频| 免费极品av一视觉盛宴| 欧美成人免费在线观看视频| 日本888xxxx| 超碰在线免费观看97| 国产 国语对白 露脸| 国产一区亚洲二区三区| 成人不卡免费视频| 和岳每晚弄的高潮嗷嗷叫视频| 免费黄色福利视频| 涩多多在线观看| 一区二区传媒有限公司| www激情五月| heyzo亚洲| 国产又粗又猛大又黄又爽| 国产精品久久久久久久乖乖| 91香蕉视频导航| 国产成人一区二区三区别| aⅴ在线免费观看| 亚洲精品国产suv一区88| www.亚洲天堂网| 国产成人三级视频| www.色偷偷.com| 免费观看美女裸体网站| 男插女免费视频| 亚洲视频在线观看一区二区三区| 熟女熟妇伦久久影院毛片一区二区| 欧美 日韩 国产 高清| 日韩不卡一二区| 日韩avxxx| 欧美午夜小视频| 亚洲区成人777777精品| 日本国产一级片| 欧美综合在线观看视频| 欧美视频在线观看视频| 三年中文高清在线观看第6集| 粗暴91大变态调教| 日本一区二区黄色| av免费观看大全| 日本欧美视频在线观看| 欧美这里只有精品| 黄色一级片国产| 日韩不卡视频一区二区| 吴梦梦av在线| 美女黄色片网站| 大地资源第二页在线观看高清版| 爆乳熟妇一区二区三区霸乳| 黄色国产精品视频| 日本精品久久久久中文字幕| 黄色片视频在线播放| 韩国日本美国免费毛片| 在线观看高清免费视频| 亚洲美女性囗交| 在线观看视频在线观看| 美女黄色片网站| 欧美日韩福利在线| 男人和女人啪啪网站| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 欧美亚洲另类色图| 亚洲色图 在线视频| 亚洲制服中文字幕| 女人被男人躁得好爽免费视频| 一本大道东京热无码aⅴ| 国产免费一区二区视频| 午夜精品久久久内射近拍高清| 亚洲欧美国产日韩综合| 91aaa精品| 蜜桃传媒一区二区三区| 婷婷六月天在线| 亚洲美女自拍偷拍| 国产人妻777人伦精品hd| 欧美黄色性生活| 黄色一级大片免费| 日韩无套无码精品| 男人j进女人j| 日本新janpanese乱熟| 一级一片免费播放| 久色视频在线播放| 特级黄色片视频| 青青草原成人网| 欧美日韩一区二区三区电影| 亚洲美免无码中文字幕在线| 特级丰满少妇一级| 日韩国产欧美亚洲| 91九色国产ts另类人妖| 三级在线视频观看| 国产精品一色哟哟| 久久久福利影院| 免费涩涩18网站入口| a级片一区二区| 美女在线视频一区二区| 丰满少妇久久久| 日本一本草久p| 亚洲一区二区三区观看| 99久久国产宗和精品1上映| 黄色录像特级片| 99国产精品久久久久久| 欧美韩国日本在线| 国产天堂视频在线观看| 日韩视频在线观看视频| 91精品999| 中文字幕22页| 激情 小说 亚洲 图片: 伦| 亚洲熟妇av日韩熟妇在线| 伊人网在线免费| 国产精品无码乱伦| 9l视频白拍9色9l视频| 999香蕉视频| 免费在线观看日韩视频| www.com毛片| 国产免费成人在线| 91精品91久久久中77777老牛| 人妻av无码专区| 亚洲熟妇无码av在线播放| 精品久久久无码人妻字幂| 国产女教师bbwbbwbbw| 欧美日韩视频免费| 欧美日韩福利在线| 欧美色图色综合| 久久精品香蕉视频| 久热精品在线播放| 日韩av加勒比| a级片一区二区| 激情五月宗合网| 欧美 日韩 国产 激情| 999在线观看| 一本色道久久88亚洲精品综合| 日韩精品在线播放视频| 精品国产一区二区三区无码| 欧美视频在线观看网站| www.超碰com| 中文字幕黄色大片| 日日噜噜夜夜狠狠久久丁香五月| 国产一级片91| 日韩精品一区二区三区不卡| 天堂在线中文在线| 欧美黄色免费网址| 1024精品视频| 日韩av.com| 男人添女荫道口图片| 久久午夜夜伦鲁鲁一区二区| 操人视频免费看| 久久久久免费看黄a片app| 能在线观看的av网站| 中文字幕av久久| 国产淫片免费看| 熟女熟妇伦久久影院毛片一区二区| 男人插女人视频在线观看| 狠狠热免费视频| 国产高清av在线播放| 亚洲图色中文字幕| 日韩中文字幕三区| 亚洲第一页在线视频| 91香蕉视频导航| 亚洲自偷自拍熟女另类| 男人的天堂成人| 久草福利视频在线| 日韩欧美一区二| 国风产精品一区二区| 三日本三级少妇三级99| 欧美少妇性生活视频| 国产精品久久中文字幕| 久久视频免费在线| 久久免费看毛片| 福利视频999| 自拍偷拍21p| 爱情岛论坛成人| 国产福利影院在线观看| 欧美视频免费播放| 日韩xxxx视频| 日韩网站在线免费观看| 97av中文字幕| 日韩成人午夜影院| 国产女主播av| 天堂av在线中文| 欧美久久久久久久久久久久久久| 91香蕉视频免费看| 欧洲美女和动交zoz0z| 五月天综合婷婷|