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

站長資訊網
最全最豐富的資訊網站

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

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

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

Event Loop

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

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

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

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

  • microtask queue 微任務隊列。會有一個微任務隊列,一個 Task 內一般會執行清空微任務隊列。

  • 如此往復。

性能測量

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

測試函數

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()                     // 執行 COUNT 次宏任務之后 計算平均每秒執行了多少個                     this.cb({                         avg: this.COUNT / (endTime - startTime) * 1000,                         timestamp: endTime                     })                     !this.stop && this.macroTaskDispatcher(scope)                 }             }             this.macroTaskDispatcher(fn)         }         scope()     }      stop() {         this.stop = true     } }
登錄后復制

之后,執行一些死循環去測試是否能檢測到密集同步代碼執行。

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 上測試兩邊會有明顯差距。【相關教程推薦: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 是不完全能準確記錄下每一個任務的。根據 HTML Standrad 和 MDN 的說法,setTimeout 最少的會等待4ms。從這個角度看 browser avg * 4ms

approx

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

setImmediate

如果使用 node.js 的 setImmediate

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

可以看到執行次數大概高出 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 階段執行。使用 setImmediate 應該是能準確記錄每一次 Loop 的。我這臺機器大概是 40000 到 60000 之間的循環次數。

window.postMessage

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

如果想在瀏覽器中實現 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 是成對出現的,也就是說一個loop內大家都只執行了一次。我猜測是 window.postMessage 的實現方式消耗會大一些。

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 // 一起執行 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次數呢?

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中。

總結

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

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

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

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
日韩av一二三四| 成人性做爰片免费视频| 国产一级不卡毛片| 久久久久久香蕉| 欧美激情精品久久久久久小说| 中文字幕日本最新乱码视频| 91精品国产三级| 黄色一级二级三级| 亚洲中文字幕无码专区| 国产免费裸体视频| 欧美黄网在线观看| 懂色av粉嫩av蜜臀av| 色天使在线观看| 男人操女人免费| 天堂中文视频在线| 黄色a级片免费| 欧美 国产 小说 另类| 2021国产视频| 日本一本二本在线观看| 国产极品尤物在线| 中文字幕一区二区三区四区在线视频| 日本午夜激情视频| 亚洲天堂第一区| 天天av天天操| 国产视频1区2区3区| 好吊色这里只有精品| 999在线精品视频| 亚洲第一成肉网| 999香蕉视频| 青青青国产在线视频| 国产又爽又黄ai换脸| 色婷婷.com| 视频二区在线播放| 日本欧美视频在线观看| 成人手机视频在线| 免费特级黄色片| 成人精品小视频| 亚洲成人天堂网| 艳母动漫在线免费观看| 蜜臀精品一区二区| 国产欧美综合一区| 国产自产在线视频| 大西瓜av在线| 亚洲这里只有精品| eeuss中文| 日本黄xxxxxxxxx100| www.久久av.com| 国产一级片中文字幕| 天天干天天色天天干| 亚洲免费av网| 免费不卡av网站| 肉色超薄丝袜脚交| 伊人免费视频二| 亚洲色精品三区二区一区| 日本三级黄色网址| japanese在线播放| 国产精品视频一区二区三区四区五区| 亚洲午夜精品一区| 欧美 亚洲 视频| 青草全福视在线| 久激情内射婷内射蜜桃| 国产成人a亚洲精v品无码| 国内精品国产三级国产aⅴ久| 免费看污污网站| 日本老太婆做爰视频| 欧美日韩成人免费视频| 妺妺窝人体色777777| dy888午夜| 亚洲va在线va天堂va偷拍| 高清无码一区二区在线观看吞精| 99福利在线观看| 无码人妻精品一区二区蜜桃百度| 日本特黄在线观看| 国产原创中文在线观看| 色诱视频在线观看| 久久久久久久久久福利| 日韩精品第1页| 男人亚洲天堂网| 日韩黄色片视频| 日韩一级理论片| 国产午夜精品视频一区二区三区| 日韩不卡视频一区二区| 18禁男女爽爽爽午夜网站免费| 九九精品久久久| 91制片厂免费观看| 好吊色这里只有精品| 久久精品国产99久久99久久久| 在线观看三级网站| 欧美午夜aaaaaa免费视频| 大桥未久一区二区| 亚洲成人av免费看| 国产美女无遮挡网站| 香蕉视频999| 樱空桃在线播放| 欧美一区二区三区爽大粗免费| 亚洲精品乱码久久久久久自慰| 久久视频免费在线| 激情 小说 亚洲 图片: 伦| 精品一区二区三区无码视频| 成人三级视频在线播放| 116极品美女午夜一级| 屁屁影院ccyy国产第一页| 国产伦精品一区二区三区四区视频_| 国产成人在线综合| www.国产在线视频| 国产乱子伦精品视频| 久久99久久久久久| 草草草视频在线观看| 毛片在线播放视频| 日韩欧美中文视频| 日韩精品视频在线观看视频| 国产精品夜夜夜爽张柏芝| 欧美精品久久久久久久自慰| 69堂免费视频| 国产午夜伦鲁鲁| 国产女大学生av| 日韩video| 妓院一钑片免看黄大片| 国产午夜精品视频一区二区三区| 高清无码视频直接看| 成人在线免费播放视频| 国产免费黄视频| 亚洲欧美天堂在线| 三级在线免费看| 成人中文字幕在线播放| 欧洲av无码放荡人妇网站| 男女激情无遮挡| 糖心vlog在线免费观看| 久久久久久久久久久久久国产精品| 国产精品久久中文字幕| 日韩av黄色网址| 日本福利视频在线| 少妇网站在线观看| av天堂永久资源网| youjizzxxxx18| 欧美人成在线观看| xx欧美撒尿嘘撒尿xx| 免费黄色一级网站| 毛片在线视频观看| 污污污污污污www网站免费| 久久久久久久久久久99| av片中文字幕| 日韩中文字幕三区| 农村妇女精品一二区| 熟妇人妻va精品中文字幕| 免费极品av一视觉盛宴| 爱爱爱视频网站| 久久99爱视频| 久久这里只精品| 37pao成人国产永久免费视频| 少妇人妻在线视频| 国产又爽又黄ai换脸| 人妻av无码专区| 亚洲免费视频播放| 国产一级免费大片| 91免费版看片| 日本阿v视频在线观看| 亚洲国产欧美91| 欧美婷婷精品激情| 国产一二三在线视频| 无限资源日本好片| 亚洲高清视频免费| 久久久久久久久久久视频| 一级 黄 色 片一| 日本在线视频www| 成年人视频观看| 亚洲国产精品影视| 欧美乱大交xxxxx潮喷l头像| 国产精品探花在线播放| 国产精品国产亚洲精品看不卡| 妞干网在线视频观看| www.日本少妇| 男人的天堂99| 91精品91久久久中77777老牛| 国产精品涩涩涩视频网站| 国产亚洲精品久久久久久久| 国产性生活免费视频| 国产对白在线播放| 日本三级福利片| 丰满少妇在线观看| 亚洲黄色小视频在线观看| 做爰高潮hd色即是空| 日本福利视频在线观看| 国产成人a亚洲精v品无码| 美女扒开大腿让男人桶| 天天爱天天做天天操| 粉嫩av一区二区三区天美传媒| 2022中文字幕| 久久久一二三四| 青青在线免费观看视频| 久久久久免费看黄a片app| 隔壁人妻偷人bd中字| 国产专区在线视频| 国产欧美高清在线| 丰满的少妇愉情hd高清果冻传媒| 91人人澡人人爽人人精品| 麻豆中文字幕在线观看| 蜜桃网站在线观看| 午夜视频在线观| 亚洲免费成人在线视频|