午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

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

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

瀏覽:186日期: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 的簡(jiǎn)要介紹3.2 forEach 等的測(cè)速4. for-of4.1 for-of 的簡(jiǎn)要介紹4.2 for-of 的循環(huán)測(cè)速5. for-in 循環(huán)6. 總結(jié)前言

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

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

測(cè)試環(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)清晰,能夠隨時(shí) break 停止。

我們先用 10 次的測(cè)試來(lái)看下:

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)測(cè)速

在第 1 次和第 2 次時(shí)耗時(shí)比較多,從第 3 次開(kāi)始就一直維持在 1.25ms 左右。

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

這兩個(gè)放在一起,也是他們的結(jié)構(gòu)足夠像,而且也能夠隨時(shí) 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)在瀏覽器上運(yùn)行的結(jié)果:

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

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

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

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

3.1 forEach 的簡(jiǎn)要介紹

這幾種方法是無(wú)法停止循環(huán)的,無(wú)論使用break還是return,都無(wú)法停止整個(gè)循環(huán)。我們可以做一個(gè)測(cè)試,例如我想當(dāng)遇到 3 的倍數(shù)時(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}`);});

運(yùn)行結(jié)果如下:

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

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

那循環(huán)是否真的像炫邁一樣停不下來(lái)嗎?并不,還有一種方式,可以停止循環(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捕獲異常,避免整個(gè)服務(wù)被掛掉。

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

3.2 forEach 等的測(cè)速

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

// forEach 的測(cè)試: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 的測(cè)試: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 的測(cè)試: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 個(gè)循環(huán)的時(shí)間差不多,我這里就只截取了 forEach 的測(cè)試結(jié)果。

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

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

4. for-of

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

4.1 for-of 的簡(jiǎn)要介紹

一個(gè)數(shù)據(jù)結(jié)構(gòu)只要部署了 Symbol.iterator 屬性,就被視為具有 iterator 接口,就可以用 for...of 循環(huán)遍歷它的成員。也就是說(shuō),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)、某些類(lèi)似數(shù)組的對(duì)象(比如 arguments 對(duì)象、DOM NodeList 對(duì)象)、后文的 Generator 對(duì)象,以及字符串。

for-of 拿到的就是 value 本身,而 for-in 則拿到的是 key,然后通過(guò) 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)測(cè)速

測(cè)試 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’);}

測(cè)試結(jié)果:

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

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

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

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

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’);}

測(cè)試結(jié)果:

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

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

數(shù)組類(lèi)型的數(shù)據(jù)還是不要使用采用 for-in 循環(huán)了;Object 類(lèi)型的可以通過(guò)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)時(shí)間也大概在 14ms 左右,要比 for-in 快很多。

6. 總結(jié)

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

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

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

2.for-of 循環(huán)的時(shí)間稍長(zhǎng);

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

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

每種循環(huán)的時(shí)長(zhǎng)不一樣,我們?cè)谶x擇循環(huán)方式時(shí),除了考慮時(shí)間外,也要考慮到語(yǔ)義化和使用的場(chǎng)景。

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

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 麻豆精品免费视频 | 亚洲人在线观看 | 亚洲精品一区二区三区在线观看 | 激情图片在线观看 | 天堂成人在线视频 | 国产福利小视频在线观看 | 久久大胆| 国产欧美日韩中文字幕 | 精品一区中文字幕 | 亚洲欧美a | 欧洲av在线播放 | 国产福利久久久 | 新超碰97 | 久久久激情视频 | 欧美视频免费 | 麻豆网站在线播放 | 草民午夜理伦三级 | 欧美成人免费在线视频 | 精品久久国产视频 | 亚洲成人动漫在线观看 | 黄色一级图片 | 成人中文字幕在线 | 在线看免费av | 日本一区二区三区在线观看视频 | 毛片一级在线观看 | 国产99免费 | 丁香婷婷网 | 精品国产一区在线观看 | av国产精品 | 欧美激情图片小说 | 国产ts人妖调教重口男 | 久久综合久久综合久久综合 | 久久久久久99| 337p粉嫩大胆噜噜噜亚瑟影院 | 天堂中文字幕在线观看 | 夫绿帽中文字幕日本 | 色综合五月天 | 亚州欧美日韩 | wwwwww国产| 亚洲在线免费观看视频 | 日本免费网站视频 |