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一区二区
欧美 日韩 国产一区| 九一免费在线观看| 99久久99久久精品| 手机在线成人免费视频| 国产超级av在线| 久久久久久久久久久福利| 黄色三级中文字幕| 无码人妻丰满熟妇区96| 337p亚洲精品色噜噜狠狠p| 成年人三级视频| 裸体大乳女做爰69| 男人添女人下部视频免费| 特色特色大片在线| aa在线免费观看| 无码日韩人妻精品久久蜜桃| 久久婷婷国产91天堂综合精品| 天天操天天爱天天爽| 97超碰免费观看| 亚洲国产精品影视| 亚洲熟妇av日韩熟妇在线| 成人性做爰aaa片免费看不忠| 欧美色图色综合| 中文字幕网av| 国产对白在线播放| 女人天堂av手机在线| 可以免费在线看黄的网站| 欧美第一页浮力影院| 日韩av福利在线观看| 日韩中文字幕在线视频观看| 99色精品视频| 91制片厂免费观看| 男的插女的下面视频| 日本福利视频导航| 丰满的少妇愉情hd高清果冻传媒| 依人在线免费视频| 亚洲熟妇av一区二区三区漫画| 超碰在线人人爱| 800av在线免费观看| 熟妇人妻无乱码中文字幕真矢织江 | 免费不卡av网站| 777777av| 黄色免费高清视频| 茄子视频成人免费观看| 免费人成在线观看视频播放| 亚洲色精品三区二区一区| 国产91视频一区| 91视频这里只有精品| 人妻无码视频一区二区三区| 少妇熟女一区二区| 欧美特级aaa| 黄色片视频在线免费观看| 高清无码视频直接看| 中国黄色片一级| 国产视频一区二区视频| 97干在线视频| 欧美xxxx吸乳| 男女啪啪的视频| jizz大全欧美jizzcom| 午夜肉伦伦影院| 男女视频网站在线观看| 黄页网站在线观看视频| 国产美女视频免费| 爽爽爽在线观看| a级片一区二区| 999热精品视频| 午夜视频在线观| 亚洲天堂2018av| 黄色三级视频在线| 嫩草视频免费在线观看| 手机av在线网| 视频一区二区视频| 国产资源第一页| 人人妻人人澡人人爽欧美一区双| 在线免费黄色小视频| 久久国产精品免费观看| 日本一二三区视频在线| 国产一级片91| 九一国产精品视频| 成年人小视频网站| 亚洲高清在线不卡| 午夜免费福利网站| 久久久久久久9| 999在线观看视频| 人妻熟妇乱又伦精品视频| 国产免费成人在线| 国产精品乱码久久久久| 污污的网站免费| 无颜之月在线看| 男人天堂网视频| www.五月天色| 激情深爱综合网| 天天影视综合色| 国产成人三级视频| 99久久国产宗和精品1上映| 亚洲天堂网2018| 黄网站欧美内射| 天天操,天天操| 300部国产真实乱| 日本爱爱免费视频| 992tv快乐视频| 五月婷婷激情久久| 成人免费看片'免费看| 亚洲国产高清av| 日韩欧美不卡在线| 想看黄色一级片| 欧美性久久久久| 久久久久久久久久久久久国产| 成人三级视频在线播放| 2022中文字幕| 亚欧激情乱码久久久久久久久| 999一区二区三区| 91免费网站视频| 国内外成人免费在线视频| 欧美极品欧美精品欧美| 人人妻人人澡人人爽精品欧美一区| 日本久久久精品视频| 无码人妻精品一区二区三区99v| 亚洲欧美另类动漫| 被灌满精子的波多野结衣| 8x8x成人免费视频| www黄色在线| 99福利在线观看| 精品视频在线观看一区| 黄色网在线视频| 男女激烈动态图| 日本中文字幕在线不卡| 婷婷激情5月天| 色一情一区二区三区| 妺妺窝人体色www在线观看| 欧美极品欧美精品欧美| 日本中文字幕网址| 干日本少妇首页| 成人一对一视频| 91精品91久久久中77777老牛| 国产主播自拍av| 尤物av无码色av无码| 国产l精品国产亚洲区久久| 亚洲 高清 成人 动漫| 18岁网站在线观看| 欧美黑人又粗又大又爽免费| 国产1区2区在线| 凹凸国产熟女精品视频| 欧美伦理视频在线观看| 啊啊啊国产视频| 亚洲欧美日韩综合网| 亚洲免费成人在线视频| 亚洲xxx在线观看| 欧美 另类 交| 欧美国产日韩激情| av无码精品一区二区三区| 手机在线看福利| 日本三级福利片| 久久这里只有精品18| 日韩精品一区二区三区久久| 午夜两性免费视频| 日韩一级特黄毛片| 欧美丰满熟妇xxxxx| 不卡的在线视频| 久久亚洲国产成人精品无码区| 99精品在线免费视频| 亚洲另类第一页| 日韩 欧美 视频| 污污的视频免费| www插插插无码视频网站| 无需播放器的av| 国产午夜福利100集发布| 91视频免费版污| 亚洲国产精品成人天堂| 性欧美极品xxxx欧美一区二区| 三级av免费看| 成人性做爰aaa片免费看不忠| 欧美国产日韩在线视频| 老太脱裤子让老头玩xxxxx| 欧美特黄aaa| av黄色在线网站| 麻豆一区二区三区在线观看| 116极品美女午夜一级| 亚洲色图都市激情| 一级黄色香蕉视频| 中文字幕无码精品亚洲资源网久久| 凹凸日日摸日日碰夜夜爽1| 日本香蕉视频在线观看| 福利片一区二区三区| av黄色在线网站| 人妻久久久一区二区三区| 免费成人深夜夜行网站视频| 国产精品视频分类| 天天操天天摸天天爽| 欧美在线一区视频| 久久久久久久9| a级片一区二区| 精品一区二区成人免费视频| 一区二区久久精品| 久久99爱视频| 午夜激情av在线| 免费精品99久久国产综合精品应用| 欧美女人性生活视频| 国产又黄又猛视频| 欧美日韩在线中文| 国产视频一区二区三区在线播放|