為什么普通 for 循環(huán)的性能遠(yuǎn)遠(yuǎn)高于 forEach 的性能寒锚?

作為一名前端開(kāi)發(fā),for和foreach循環(huán)遍歷幾乎每天都在使用违孝,那么這兩種遍歷方式哪一種效率更高呢壕曼? 效率高的原因是什么呢?

一等浊、for( )循環(huán)

通過(guò)下標(biāo)腮郊,對(duì)循環(huán)中的代碼反復(fù)執(zhí)行,功能強(qiáng)大筹燕,可以通過(guò)index取得元素轧飞。在處理比較復(fù)雜的處理的時(shí)候較為方便

二、forEach( )循環(huán)

forEach() 方法用于調(diào)用數(shù)組的每個(gè)元素撒踪,并將元素傳遞給回調(diào)函數(shù)过咬。foreach有的也叫增強(qiáng)for循環(huán),foreach其實(shí)是for循環(huán)的一個(gè)特殊簡(jiǎn)化版制妄。注意掸绞,forEach() 對(duì)于空數(shù)組是不會(huì)執(zhí)行回調(diào)函數(shù)的

array.forEach(function(currentValue, index, arr), thisValue)

function(currentValue, index, arr):必需。 數(shù)組中每個(gè)元素需要調(diào)用的函數(shù)。

| currentValue | 必需衔掸,當(dāng)前元素 |
| index | 可選烫幕,當(dāng)前元素的索引值。 |
| arr | 可選敞映,當(dāng)前元素所屬的數(shù)組對(duì)象较曼。 |

thisValue:可選。傳遞給函數(shù)的值一般用 "this" 值振愿。如果這個(gè)參數(shù)為空捷犹, "undefined" 會(huì)傳遞給 "this"

三、console.time和console.timeEnd用法

console.time和console.timeEnd這兩個(gè)方法可以用來(lái)讓W(xué)EB開(kāi)發(fā)人員測(cè)量一個(gè)javascript腳本程序執(zhí)行消耗的時(shí)間冕末。隨著WEB應(yīng)用越來(lái)越重要萍歉,JavaScript的執(zhí)行性能也日益受到重視,WEB開(kāi)發(fā)人員知道一些性能測(cè)試機(jī)器是必須的档桃。測(cè)試JavaScript性能的方法有很多枪孩,但console.time/console.timeEnd兩個(gè)方法是最基本、最直接的技巧胳蛮。

  1. console.time方法是開(kāi)始計(jì)算時(shí)間
  2. console.timeEnd是停止計(jì)時(shí)销凑,輸出腳本執(zhí)行的時(shí)間。
  3. 這兩個(gè)方法中都可以傳入一個(gè)參數(shù)仅炊,作為計(jì)時(shí)器的名稱(chēng)斗幼,它的作用是在代碼并行運(yùn)行時(shí)分清楚各個(gè)計(jì)時(shí)器。
  4. 對(duì)console.timeEnd的調(diào)用會(huì)立即輸出執(zhí)行總共消耗的時(shí)間抚垄,單位是毫秒蜕窿。
// 啟動(dòng)計(jì)時(shí)器
console.time('計(jì)時(shí)器名稱(chēng)');

// (寫(xiě)一些測(cè)試用代碼)

// 停止計(jì)時(shí),輸出時(shí)間
console.timeEnd('計(jì)時(shí)器名稱(chēng)');

四呆馁、測(cè)試性能

在1000000這個(gè)級(jí)別下桐经,forEach 的性能高于for

let arrs = new Array(1000000);

console.time('for');
for (let i = 0; i < arrs.length; i++) {};
console.timeEnd('for'); // for: 10.329833984375ms

console.time('forEach');
arrs.forEach((arr) => {});
console.timeEnd('forEach'); // forEach: 5.076904296875ms

在10000000這個(gè)級(jí)別下,forEach 的性能還是高于for

let arrs = new Array(10000000);

console.time('for');
for (let i = 0; i < arrs.length; i++) {};
console.timeEnd('for'); // for: 95.157958984375ms

console.time('forEach');
arrs.forEach((arr) => {});
console.timeEnd('forEach'); // forEach: 37.9619140625ms

在100000000級(jí)以上的量級(jí)上 浙滤,forEach的性能遠(yuǎn)遠(yuǎn)低于for的性能

let arrs = new Array(100000000);

console.time('for');
for (let i = 0; i < arrs.length; i++) {};
console.timeEnd('for'); // for: 939.18994140625ms

console.time('forEach');
arrs.forEach((arr) => {});
console.timeEnd('forEach'); // forEach: 1614.8642578125ms

五阴挣、for和forEach的區(qū)別

【3.1】遍歷

for循環(huán)按順序遍歷,forEach使用iterator迭代器遍歷

【3.2】數(shù)據(jù)結(jié)構(gòu)

for循環(huán)是隨機(jī)訪(fǎng)問(wèn)元素纺腊,foreach是順序鏈表訪(fǎng)問(wèn)元素

【3.3】性能上

對(duì)于arraylist畔咧,是順序表,使用for循環(huán)可以順序訪(fǎng)問(wèn)揖膜,速度較快誓沸;使用foreach會(huì)比f(wàn)or循環(huán)稍慢一些。
對(duì)于linkedlist壹粟,是單鏈表拜隧,使用for循環(huán)每次都要從第一個(gè)元素讀取next域來(lái)讀取,速度非常慢;使用foreach可以直接讀取當(dāng)前結(jié)點(diǎn)洪添,數(shù)據(jù)較快垦页;

六、如何選擇

foreach相對(duì)于for循環(huán)薇组,代碼減少了外臂,但是foreach依賴(lài)IEnumerable坐儿。在運(yùn)行的時(shí)候效率低于for循環(huán)律胀。當(dāng)然了,在處理不確定循環(huán)次數(shù)的循環(huán)貌矿,或者循環(huán)次數(shù)需要計(jì)算的情況下炭菌。使用foreach比較方便。而且foreach的代碼經(jīng)過(guò)編譯系統(tǒng)的代碼優(yōu)化后逛漫,和for循環(huán)的循環(huán)類(lèi)似黑低。

可以說(shuō),foreach語(yǔ)句是for語(yǔ)句的特殊簡(jiǎn)化版本酌毡,在遍歷數(shù)組克握、集合方面,foreach為開(kāi)發(fā)人員提供了極大的方便枷踏。在復(fù)雜的循環(huán)設(shè)計(jì)時(shí)菩暗,還是應(yīng)該使用for循環(huán)更加的靈活。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旭蠕,一起剝皮案震驚了整個(gè)濱河市停团,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掏熬,老刑警劉巖佑稠,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異旗芬,居然都是意外死亡舌胶,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)疮丛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)幔嫂,“玉大人,你說(shuō)我怎么就攤上這事这刷⊥裱蹋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵暇屋,是天一觀(guān)的道長(zhǎng)似袁。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么昙衅? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任扬霜,我火速辦了婚禮,結(jié)果婚禮上而涉,老公的妹妹穿的比我還像新娘著瓶。我一直安慰自己,他們只是感情好啼县,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布材原。 她就那樣靜靜地躺著,像睡著了一般季眷。 火紅的嫁衣襯著肌膚如雪余蟹。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,196評(píng)論 1 308
  • 那天子刮,我揣著相機(jī)與錄音威酒,去河邊找鬼。 笑死挺峡,一個(gè)胖子當(dāng)著我的面吹牛葵孤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播橱赠,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼尤仍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了病线?” 一聲冷哼從身側(cè)響起吓著,我...
    開(kāi)封第一講書(shū)人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎送挑,沒(méi)想到半個(gè)月后绑莺,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惕耕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年纺裁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片司澎。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡欺缘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挤安,到底是詐尸還是另有隱情谚殊,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布蛤铜,位于F島的核電站嫩絮,受9級(jí)特大地震影響丛肢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剿干,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一蜂怎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧置尔,春花似錦杠步、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至差导,卻和暖如春试躏,著一層夾襖步出監(jiān)牢的瞬間猪勇,已是汗流浹背设褐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泣刹,地道東北人助析。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像椅您,于是被迫代替她去往敵國(guó)和親外冀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359