国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

新穎的 setTimeout() 替代方案

開發 前端
scheduler.yield()為JavaScript中的任務調度提供了一個強大的新工具。它不僅性能更優,還能更好地處理任務優先級。對于需要處理長時間運行任務的前端開發者來說,這是一個值得關注和采用的新技術。

在前端開發中,長時間運行的JavaScript任務一直是一個棘手的問題。它們會導致頁面無響應,影響用戶體驗。傳統上,開發者使用setTimeout()來分割長任務,但這種方法存在明顯的缺陷。最近,Chrome 129引入了一種新的、更高效的方法:scheduler.yield()。本文將深入探討這種新技術,并比較其與傳統方法的優劣。

長任務的問題

為了說明長任務的問題,以下是一個示例,任何字符都有其代碼,但并非所有代碼都有相關字符。所有非字符代碼都顯示為白色垂直矩形。您可以在下面顯示與一系列代碼相對應的字符的頁面中看到許多代碼:

圖片圖片

有很多垂直的矩形,想把它們過濾掉,通過遍歷一系列Unicode字符代碼,過濾掉未分配的代碼點。

const MIN = 127734, MAX = 129686;

function insertChar(code, parent) {
    parent.insertAdjacentText('beforeend', String.fromCodePoint(code));
}

function add(i, parent) {
    if (!likeNull(i)) // 比較字符i和0的canvas
        insertChar(i, parent);
}

function one(div) {
    for (let i = MIN; i < MAX; i++)
        add(i, div);
}

function onClick(func) {
    btn.addEventListener('click', async () => {
        btn.remove();
        const start = Date.now();
        await func(div);
        div.insertAdjacentText("afterend", Date.now() - start);
    });
}

onClick(one);

圖片圖片

這段代碼在執行過程中會使頁面凍結約4279毫秒,而在此期間,頁面一直處于凍結狀態。即使點擊后代碼會首先移除按鈕,但只要代碼還在運行,瀏覽器就無法更新屏幕。代碼運行結束后,瀏覽器也無法顯示任何字符,按鈕會被移除,字符也會一并顯示, 導致用戶體驗不佳。

因此,在長時間工作時,一定要暫停,讓瀏覽器更新屏幕。可以使用類似的語句暫時中止或中斷長代碼的執行.

使用setTimeout()分割任務

傳統的解決方法是使用setTimeout()來分割任務:

function pause() {
    return new Promise(resolve => setTimeout(resolve));
}

async function two(div) {
    for (let i = MIN; i < MAX; i++) {
        await pause();
        add(i, div);
    }
}

onClick(two);

圖片圖片

這種方法雖然使頁面保持響應,但執行時間顯著增加到約17568毫秒。

setTimeout()的缺點

1.最小超時時間為4毫秒,即使指定為0

即使瀏覽器無事可做,主任務也會暫停至少 4 毫秒。即使指定為零,setTimeout()的最小超時時間 也是 >4 ms。事實上,讓我們來計算一下。在第一頁中,評估 1952 個代碼點需要 4279 毫秒,即每個代碼需要 ~2 毫秒。在第二個頁面中,評估 1952 個代碼點需要 17568 毫秒,即每個代碼點 ~17568/1952=9毫秒。頁面響應速度保持不變,但性能下降也令人印象深刻,這主要是由于超時的持續時間盡可能短。

2.任務繼續執行時被放置在隊列末尾,可能導致優先級問題。

當任務暫停時,setTimeout() 會將其作為一個新任務放置在隊列的最末端。因此,瀏覽器不僅會更新屏幕,還會先執行隊列中的所有任務,然后再繼續執行暫停的任務。

圖片圖片

在上面的頁面中,兩個函數two()同時運行:

onClick(()=>Promise.race([two(div),two(div2)]));

當第一個two()提交給主線程時,第二個two()會在第一個two()繼續執行之前被執行。執行時間會稍有增加,從 17 秒增加到 23 秒,但不會增加兩倍,因為大部分運行時間都是由最小超時加起來的。

scheduler.yield():新的解決方案

scheduler.yield()提供了一種更高效的方法來讓出主線程:

async function three(div) {
    for (let i = MIN; i < MAX; i++) {
        await scheduler.yield();
        add(i, div);
    }
}

onClick(three);

圖片圖片

使用scheduler.yield(),執行時間減少到約5646毫秒,顯著優于setTimeout()方法。

scheduler.yield()的優勢

  1. 更高的性能:執行時間更接近于未中斷的任務。
  2. 優先級處理:被暫停的任務被放置在隊列頭部,而不是末尾。

示例比較:

// 同時執行兩個three()函數
onClick(() => Promise.race([three(div), three(div2)]));

// three()與setTimeout()基于的two()比較
onClick(() => Promise.race([three(div), two(div2)]));

結果與上述基于setTimeout()的index4.html的不同之處僅在于執行時間。10183 毫秒相當于兩次 5645 毫秒。兩個任務似乎都沒有優先級。

優先級似乎不起作用,因為兩個函數three()都不在隊列中等待。但看看這個:

圖片圖片

在與setTimeout()基于的方法比較時,scheduler.yield()顯示出明顯的優先級優勢。

結語

scheduler.yield()為JavaScript中的任務調度提供了一個強大的新工具。它不僅性能更優,還能更好地處理任務優先級。對于需要處理長時間運行任務的前端開發者來說,這是一個值得關注和采用的新技術。

在實際應用中,開發者可以考慮在處理大量數據處理、復雜計算或頻繁DOM操作等場景時使用scheduler.yield()。這將有助于保持頁面的響應性,同時不會顯著影響任務的執行效率。隨著瀏覽器支持的增加,scheduler.yield()有望成為前端性能優化的重要工具。

責任編輯:武曉燕 來源: 大遷世界
相關推薦

2025-07-17 13:48:24

Micronaut微服務Spring

2022-08-02 16:54:23

Kubernetes容器工具

2018-05-15 14:55:23

VMwarePKS方案

2023-07-10 16:21:53

2010-03-02 15:51:05

Android手機

2010-06-17 22:16:48

2019-07-11 09:13:48

區塊鏈去中心化比特幣

2020-11-11 18:56:32

工具代碼開發

2013-08-12 10:15:34

2023-02-03 17:47:28

2021-04-10 15:20:05

PlausibleGoogle Anal分析工具

2022-04-12 10:34:05

Web框架方案

2020-06-12 08:22:27

React ReduxReact開發

2019-08-28 08:00:00

Splunk分析日志系統管理員

2012-07-13 10:17:39

HadoopHDFS

2014-08-18 09:59:04

2021-09-29 15:49:37

Exchange開源用戶開發者

2013-08-30 15:56:57

MySQLMariaDB

2022-03-13 10:48:52

容器Docker容器管理軟件

2022-07-06 08:25:17

服務網格Kubernetes
點贊
收藏

51CTO技術棧公眾號

在线观看二区| 成人美女av在线直播| 91视频免费版污| 欧美日韩亚洲一区| 日韩中文理论片| 欧美日韩国产第一页| 手机在线免费看av| 精品国产乱码久久久久久蜜坠欲下| 久久精品亚洲麻豆av一区二区| 欧美不卡一区二区| 日本高清视频一区二区三区| av网站一区| 午夜视频在线观看精品中文| 一区二区91| 欧美专区日韩专区| 18禁裸男晨勃露j毛免费观看 | 九九在线精品视频| 一区二区三区黄色| 在线免费观看你懂的| 国产精品hd| 欧美第一黄网免费网站| 自由的xxxx在线视频| 国产精品久久久久9999高清| 亚洲激情一二三区| 98精品在线视频| 欧美激情视频网| 久久久久久久少妇| 国产成人精品亚洲午夜麻豆| 亚洲电影一二三区| 亚洲成人xxx| 台湾佬中文娱乐网欧美电影| 日韩久久精品成人| 午夜精品久久久久久久久久蜜桃| 国产亚洲精品美女久久久| 欧美日韩精品免费观看视完整| 日韩视频欧美视频| 国产欧美日韩精品一区二区三区 | 国产欧美日韩免费看aⅴ视频| 免费高清在线观看免费| 亚洲制服一区| 91精品国产乱码久久久久久久久| 欧美人妖在线| 男人添女人下部高潮视频在观看 | av女同在线| 日韩一级片在线观看| 24小时成人在线视频| 国产精品v欧美精品v日韩| 国产精品视频免费一区二区三区| 神马一区二区影院| 91九色成人| 91精品国产黑色紧身裤美女| 伦理一区二区三区| 久久国产精品网| 婷婷综合五月天| 天天揉久久久久亚洲精品| 日韩在线视频导航| 福利一区在线观看| 毛片网站在线| 国产精品尤物福利片在线观看| 国产精品日韩成人| 欧美韩国一区| 色久视频在线观看| 99精品在线观看视频| 免费不卡av| 欧美黑人xxxⅹ高潮交| 日韩国产欧美在线播放| 国产精品9999久久久久仙踪林| 成人午夜视频免费看| 日日夜夜一区| 丰满女人性猛交| 91麻豆精品国产91久久久久久久久 | 久久成人久久鬼色| 欧美黑人孕妇孕交| 亚洲成年网站在线观看| 三级小说欧洲区亚洲区| 夜色福利资源站www国产在线视频 夜色资源站国产www在线视频 | 蜜乳av一区二区三区| 九色福利视频| 亚洲欧美日韩在线高清直播| 欧美色综合网| 国产在线一在线二| 久草精品电影| 精品国产91洋老外米糕| 国产亚洲一级| 精品丝袜在线| 在线免费观看h| 天堂在线视频中文网| 亚洲成人免费在线| а√在线中文在线新版| 国产精品第100页| 韩国精品一区二区| 中文字幕在线免费专区| 亚洲一区www| 9999国产精品| 老太脱裤子让老头玩xxxxx| 色老汉一区二区三区| 日韩一二三区| 制服诱惑一区| 色欧美日韩亚洲| 91国内精品白嫩初高生| 亚洲一区高清| 色婷婷亚洲精品| 亚州av中文字幕在线免费观看| www.66久久| 久久经典视频| 久久久久久69| 久久99精品久久久久久| 在线午夜视频| 欧美黄色三级网站| 九九**精品视频免费播放| 在线播放免费| 91精品国产91久久久久福利| 国产综合久久久久久久久久久久 | 成人动漫视频| 熟妇熟女乱妇乱女网站| 日韩欧美aaa| 精品国内自产拍在线观看视频| 男人揉女人奶房视频60分| 日韩黄在线观看| 国产精品一卡| 四虎精品在永久在线观看| 久久久久久伊人| 大陆成人av片| 婷婷综合六月| 91成人在线视频观看| 欧美精品一区二区三区在线播放| 狠狠干综合网| 天天av综合网| 亚洲精品欧美日韩专区| 黄色一区二区三区| 欧美3p在线观看| v888av成人| 欧美在线免费看| 亚洲色图都市小说| 欧美做受69| 国产igao激情在线入口| 久久99亚洲热视| 久久人人97超碰com| av在线亚洲一区| 国产欧美在线一区| 欧美xxxx14xxxxx性爽| 91视频免费观看| 亚洲精品黑牛一区二区三区| www.超碰com| 欧美孕妇与黑人孕交| 亚洲精品久久久蜜桃| 精品国产91| 四虎影院在线播放| 国产精品区一区二区三含羞草| 色嗨嗨av一区二区三区| 欧美激情综合色综合啪啪| 婷婷视频在线| 亚洲视频在线二区| 亚洲天堂色网站| 26uuu久久天堂性欧美| 精品国产一区二区三区不卡蜜臂| 男女性激情视频在线观看| 亚洲v日韩v综合v精品v| 欧美剧情电影在线观看完整版免费励志电影| 日韩视频二区| 国产超碰精品| 国产精品v日韩精品v在线观看| 国产精品久久av| 欧美日韩高清一区| 国产尤物一区二区| 99香蕉久久| 日本不卡免费播放| 亚洲一区不卡在线| 欧美激情影音先锋| 日韩欧美高清在线视频| 久久精品国产亚洲aⅴ| 韩国理伦片久久电影网| 理论片鲁丝二区爱情网| 高清国语自产拍免费一区二区三区| 精品日本一线二线三线不卡| 国产激情一区二区三区| 精品日产乱码久久久久久仙踪林| 日本福利午夜视频在线| 91免费视频黄| 9.1国产丝袜在线观看 | 在线精品观看| 韩日成人影院| 亚洲欧美日韩精品久久久| 国产精品视频入口| 欧洲精品一区二区三区久久| 日韩成人三级视频| 精品国产乱码久久久久久108| 国产日韩欧美影视| 国产一区二区三区四区五区加勒比| 国产精品吴梦梦| 成人在线中文字幕| 欧美日韩一区二区视频在线观看 | 国产美女视频一区| 哺乳一区二区三区中文视频| 久久天堂电影| 久色视频在线播放| 成人午夜在线观看| 最好看的2019的中文字幕视频| 精品久久久久久久久国产字幕| 国产一区二区在线免费观看|