日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

詳解JS中你不知道的各種循環(huán)測速

瀏覽:197日期:2024-03-25 18:09:05
目錄前言1. for 循環(huán)2. while 循環(huán)和 do-while 循環(huán)3. forEach、map 和 reduce 循環(huán)3.1 forEach 的簡要介紹3.2 forEach 等的測速4. for-of4.1 for-of 的簡要介紹4.2 for-of 的循環(huán)測速5. for-in 循環(huán)6. 總結(jié)前言

在測試循環(huán)速度之前,我們先來創(chuàng)建一個有 100 萬數(shù)據(jù)的數(shù)組:

const len = 100 * 10000;const arr = [];for (let i = 0; i < len; i++) { arr.push(Math.floor(Math.random() * len));}

測試環(huán)境為:

1.電腦:iMac(10.13.6);

2.處理器:4.2 GHz Intel Core i7;

3.瀏覽器:Chrome(89.0.4389.82)

1. for 循環(huán)

for 循環(huán)是我們最常用的一種循環(huán)方式了,最大的好處就是結(jié)構(gòu)清晰,能夠隨時 break 停止。

我們先用 10 次的測試來看下:

console.log(’test for’);for (let k = 0; k < 10; k++) { console.time(’for’); let sum = 0; for (let i = 0; i < len; i++) { sum += arr[i] % 100; } console.timeEnd(’for’);}

最終得到的結(jié)果:

詳解JS中你不知道的各種循環(huán)測速

在第 1 次和第 2 次時耗時比較多,從第 3 次開始就一直維持在 1.25ms 左右。

2. while 循環(huán)和 do-while 循環(huán)

這兩個放在一起,也是他們的結(jié)構(gòu)足夠像,而且也能夠隨時 break 停止。

console.log(’ntest while’);for (let k = 0; k < 10; k++) { console.time(’while’); let sum = 0; let i = 0; while (i < len) { sum += arr[i] % 100; i++; } console.timeEnd(’while’);}console.log(’ntest do-while’);for (let k = 0; k < 10; k++) { console.time(’do-while’); let sum = 0; let i = 0; do { sum += arr[i] % 100; i++; } while (i < len); console.timeEnd(’do-while’);}

while 循環(huán)和 do-while 循環(huán)的結(jié)果幾乎一樣,我們只看下 while 循環(huán)在瀏覽器上運行的結(jié)果:

詳解JS中你不知道的各種循環(huán)測速

跟 for 循環(huán)的速度不相上下。

3. forEach、map 和 reduce 循環(huán)

接下來來到我們常用的數(shù)組三劍客了:forEach, map, reduce 等,這 3 個方法都是在 ES6 標(biāo)準(zhǔn)上新加的語法。

3.1 forEach 的簡要介紹

這幾種方法是無法停止循環(huán)的,無論使用break還是return,都無法停止整個循環(huán)。我們可以做一個測試,例如我想當(dāng)遇到 3 的倍數(shù)時,即停止循環(huán)

[1, 2, 3, 4, 5].forEach((item) => { console.log(`before return: ${item}`); if (item % 3 === 0) { return; } console.log(`after return: ${item}`);});

運行結(jié)果如下:

詳解JS中你不知道的各種循環(huán)測速

從運行的結(jié)果可以看到,我們的 return 只是沒有執(zhí)行當(dāng)時循環(huán)時后面的語句,但并沒有停止整個循環(huán),后面的 4 和 5 依然正常輸出。

那循環(huán)是否真的像炫邁一樣停不下來嗎?并不,還有一種方式,可以停止循環(huán)。那就是拋出異常:

try { [1, 2, 3, 4, 5].forEach((item) => { console.log(`before return: ${item}`); if (item % 3 === 0) { throw new Error(’break forEach’); } console.log(`after return: ${item}`); });} catch (e) {}

在 forEach 中拋出異常后,就可以停止該循環(huán),然后再使用try-catch捕獲異常,避免整個服務(wù)被掛掉。

雖然可以停止 forEach 的循環(huán),但實現(xiàn)起來麻煩了不少。因此若沒有停止整個循環(huán)的需求,可以使用 forEach, map 等循環(huán)方式;否則還是要使用其他的循環(huán)方式。

3.2 forEach 等的測速

好的,接下來我們就要測試這 3 個循環(huán)方式的循環(huán)速度了。

// forEach 的測試:console.log(’ntest forEach’);for (let k = 0; k < 10; k++) { console.time(’forEach’); let sum = 0; arr.forEach((item) => { sum += item % 100; }); console.timeEnd(’forEach’);}

// map 的測試:console.log(’ntest map’);for (let k = 0; k < 10; k++) { console.time(’map’); let sum = 0; arr.map((item) => { sum += item % 100; }); console.timeEnd(’map’);}

// reduce 的測試:console.log(’ntest reduce’);for (let k = 0; k < 10; k++) { console.time(’reduce’); let sum = 0; arr.reduce((_, item) => { sum += item % 100; }, 0); console.timeEnd(’reduce’);}

因這 3 個循環(huán)的時間差不多,我這里就只截取了 forEach 的測試結(jié)果。

詳解JS中你不知道的各種循環(huán)測速

執(zhí)行 10 次循環(huán)后,forEach 的執(zhí)行時間差不多在 10.8ms 左右,比上面的 for 循環(huán)和 while 循環(huán)高了將近 10 倍的運行時間。

4. for-of

ES6 借鑒 C++、Java、C# 和 Python 語言,引入了 for...of 循環(huán),作為遍歷所有數(shù)據(jù)結(jié)構(gòu)的統(tǒng)一的方法。

4.1 for-of 的簡要介紹

一個數(shù)據(jù)結(jié)構(gòu)只要部署了 Symbol.iterator 屬性,就被視為具有 iterator 接口,就可以用 for...of 循環(huán)遍歷它的成員。也就是說,for...of 循環(huán)內(nèi)部調(diào)用的是數(shù)據(jù)結(jié)構(gòu)的 Symbol.iterator 方法。

for...of 循環(huán)可以使用的范圍包括數(shù)組、Set 和 Map 結(jié)構(gòu)、某些類似數(shù)組的對象(比如 arguments 對象、DOM NodeList 對象)、后文的 Generator 對象,以及字符串。

for-of 拿到的就是 value 本身,而 for-in 則拿到的是 key,然后通過 key 再獲取到當(dāng)前數(shù)據(jù)。

const fruits = [’apple’, ’banana’, ’orange’, ’lemon’];for (const value of fruits) { console.log(value); // ’apple’, ’banana’, ’orange’, ’lemon’}4.2 for-of 的循環(huán)測速

測試 for-of 循環(huán)速度的代碼:

console.log(’ntest for-of’);for (let k = 0; k < 10; k++) { console.time(’for-of’); let sum = 0; for (const value of arr) { sum += value % 100; } console.timeEnd(’for-of’);}

測試結(jié)果:

詳解JS中你不知道的各種循環(huán)測速

在多次重復(fù)同一個循環(huán)時,前 2 次的 for-of 循環(huán)時間會比較長,得在 15ms 以上。但后續(xù)的執(zhí)行,循環(huán)速度就下降到 1.5ms 左右了,與 for 循環(huán)的時間差不多。

5. for-in 循環(huán)

for-in 通常用于 object 類型的循環(huán),但也可以用來循環(huán)數(shù)組,畢竟所有數(shù)據(jù)類型的祖先都是 object 類型。

console.log(’ntest for-in’);for (let k = 0; k < 10; k++) { console.time(’for-in’); let sum = 0; for (let key in arr) { sum += arr[key] % 100; } console.timeEnd(’for-in’);}

測試結(jié)果:

詳解JS中你不知道的各種循環(huán)測速

for-in 循環(huán)的測速數(shù)據(jù)很驚人,簡直是獨一檔的存在了,最好的時候也至少需要 136ms 的時間。可見 for-in 的循環(huán)效率真的很低。

數(shù)組類型的數(shù)據(jù)還是不要使用采用 for-in 循環(huán)了;Object 類型的可以通過Object.values()先獲取到所有的 value 數(shù)據(jù),然后再使用 forEach 循環(huán):

const obj = {};for (let i = 0; i < len; i++) { obj[i] = Math.floor(Math.random() * len);}for (let k = 0; k < 10; k++) { console.time(’forEach-values’); let sum = 0; Object.values(obj).forEach((item) => { sum += item % 100; }); console.timeEnd(’forEach-values’);}

即使多了一步操作,循環(huán)時間也大概在 14ms 左右,要比 for-in 快很多。

6. 總結(jié)

我們把所有的循環(huán)數(shù)據(jù)放到一起對比一下,我們這里將每個循環(huán)的測試次數(shù)調(diào)整為 100 次,橫軸是循環(huán)的次數(shù),數(shù)軸是循環(huán)的時間:

詳解JS中你不知道的各種循環(huán)測速

1.for 循環(huán)、while 循環(huán)和 d-while 循環(huán)的時間最少;

2.for-of 循環(huán)的時間稍長;

3.forEach 循環(huán)、map 循環(huán)和 reduce 循環(huán) 3 者的數(shù)據(jù)差不多,但比 for-of 循環(huán)的時長更長一點;

4.for-in 循環(huán)所需要的時間最多;

每種循環(huán)的時長不一樣,我們在選擇循環(huán)方式時,除了考慮時間外,也要考慮到語義化和使用的場景。

以上就是詳解JS中你不知道的各種循環(huán)測速的詳細(xì)內(nèi)容,更多關(guān)于JS中各種循環(huán)測速的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩精品1区| 一区二区三区视频免费观看| 欧美成人亚洲| 免费国产自久久久久三四区久久| 中文在线а√天堂| 色偷偷偷在线视频播放| av资源中文在线| 日韩欧美中文| 久久中文字幕二区| 中文无码日韩欧| 日韩黄色免费网站| 久久wwww| 日韩成人三级| 国产精品久久久久av电视剧| 久久久久国产一区二区| 成人av二区| 亚洲精品进入| 久久精品免视看国产成人| 美女免费视频一区| 久久精品国语| 综合激情一区| 美女精品一区二区| 精品丝袜在线| 日韩综合小视频| 国产一区二区三区久久| 99精品在线观看| 亚欧洲精品视频在线观看| 国产一区二区三区四区二区| 久久精品动漫| 久久精品凹凸全集| 国产字幕视频一区二区| 日韩欧美精品一区二区综合视频| 国产成人精选| 一区二区三区四区日韩| 国产日韩欧美三级| 免费看av不卡| 日韩av资源网| 欧美日韩黑人| 成人台湾亚洲精品一区二区| 视频一区二区中文字幕| 国产一二在线播放| 日本aⅴ亚洲精品中文乱码| 久久精品99久久无色码中文字幕| 亚洲青青久久| 亚洲精品极品少妇16p| 国产欧美日韩一区二区三区在线| 亚洲综合精品| 欧美日一区二区| 久久男人av资源站| 欧美激情视频一区二区三区免费 | 欧洲精品一区二区三区| 日韩av不卡一区二区| 91久久久精品国产| 欧美天堂视频| 久久裸体视频| 在线人成日本视频| 高清日韩欧美| 国产精品主播| 国产图片一区| 国产欧美日韩精品一区二区免费| 综合国产精品| 日本vs亚洲vs韩国一区三区二区| 丝袜美腿亚洲色图| 蜜桃久久精品一区二区| 色8久久久久| 日韩av资源网| 久久爱www.| se01亚洲视频| 国产日韩综合| 亚洲v天堂v手机在线| 亚洲精品无吗| 国产精品一国产精品| 欧美专区一区| 久久精品资源| 中文字幕系列一区| 亚洲成人精选| 婷婷亚洲精品| 久久久久97| 日本国产精品| 乱人伦精品视频在线观看| 蜜桃久久久久久| 免费亚洲婷婷| 亚洲福利专区| 日韩精品三区四区| 精品国产黄a∨片高清在线| 成人午夜国产| 亚洲区国产区| 国产乱人伦丫前精品视频| sm捆绑调教国产免费网站在线观看| 国产自产自拍视频在线观看| 中国女人久久久| 麻豆免费精品视频| 欧美福利专区| 国产另类在线| 亚洲激情二区| 麻豆久久一区| 一区二区三区四区在线观看国产日韩| 国产剧情一区| 黄色欧美日韩| 精品国产aⅴ| 亚洲制服少妇| 欧美日韩视频网站| 香蕉精品999视频一区二区| 欧美aa在线视频| 国产亚洲精品久久久久婷婷瑜伽| 国产精品v日韩精品v欧美精品网站| 狠狠爱成人网| 成人午夜国产| 水蜜桃精品av一区二区| 欧美日韩黄网站| 亚洲一区二区三区高清| 亚洲一级少妇| 日韩av片子| 久久中文欧美| 久久99蜜桃| 欧美日韩va| 国产欧美一级| 亚洲综合中文| 中文在线一区| 国产精品三上| 免费国产自久久久久三四区久久 | 欧美精品1区| 日韩精品免费观看视频| 麻豆精品91| 亚洲一区亚洲| 人人精品亚洲| 日韩伦理在线一区| 亚洲欧洲美洲av| 欧美少妇精品| 日韩激情一区| 伊人久久大香线蕉av不卡| 亚洲不卡av不卡一区二区| 中文字幕人成乱码在线观看| 国产一区二区三区久久久久久久久| 精品视频免费| 日韩欧美网址| 亚洲一区二区三区免费在线观看| 美女黄网久久| 日韩高清一级| 精品国产一区二| 国产精品99视频| 中文在线а√在线8| 欧美在线亚洲综合一区| 亚洲另类av| 国产精品玖玖玖在线资源| 都市激情国产精品| 激情综合激情| 丝袜国产日韩另类美女| 国产欧美日韩一区二区三区四区 | 99久久九九| 老司机精品久久| 国产乱子精品一区二区在线观看 | 91精品国产一区二区在线观看| 日韩av电影一区| 精品99久久| 蘑菇福利视频一区播放| 青青草国产精品亚洲专区无| 国产精品99久久精品| 久久久噜噜噜| 日韩不卡免费视频| 欧美黄色一区二区| 99视频一区| 美女高潮久久久| 国产亚洲午夜| 另类专区亚洲| 日本三级亚洲精品| 欧洲亚洲一区二区三区| 亚洲1区在线观看| 国产粉嫩在线观看| 青青青国产精品| 欧美日一区二区| 国产在线观看91一区二区三区| 亚洲少妇一区| 日韩免费看片| 国产精品一区毛片| 色偷偷偷在线视频播放| 97精品国产99久久久久久免费| 国产美女高潮在线观看| 亚洲日韩中文字幕一区| 蜜臀久久99精品久久一区二区 | 亚洲我射av| 伊人久久亚洲热| 久久久五月天| 丝袜诱惑一区二区| 国产精品久久| 国产精品一区二区美女视频免费看 | 国产精品一区二区av日韩在线| 中文不卡在线| 日本大胆欧美人术艺术动态| 欧美日韩在线二区| 久久中文视频| 午夜视频精品| 夜夜嗨一区二区| 一区二区视频欧美| 日韩一级欧洲| 一区二区电影| 国产精品久久国产愉拍| 国产精品美女午夜爽爽| 亚洲一区二区免费在线观看| 一区二区国产在线观看|