爲何普通 for 循環的性能遠遠高於 forEach 的性能?

做爲一名前端開發,for和foreach循環遍歷幾乎天天都在使用,那麼這兩種遍歷方式哪種效率更高呢? 效率高的緣由是什麼呢?
javascript

1、for( )循環

經過下標,對循環中的代碼反覆執行,功能強大,能夠經過index取得元素。在處理比較複雜的處理的時候較爲方便
前端

2、forEach( )循環

forEach() 方法用於調用數組的每一個元素,並將元素傳遞給回調函數。foreach有的也叫加強for循環,foreach實際上是for循環的一個特殊簡化版。注意,forEach() 對於空數組是不會執行回調函數的
java

array.forEach(function(currentValue, index, arr), thisValue)複製代碼

function(currentValue, index, arr):必需。 數組中每一個元素須要調用的函數。
數組

currentValue 必需,當前元素
index
可選,當前元素的索引值。
arr 可選,當前元素所屬的數組對象。

thisValue: 可選。傳遞給函數的值通常用 "this" 值。若是這個參數爲空, "undefined" 會傳遞給 "this"

微信

3、console.time和console.timeEnd用法

console.timeconsole.timeEnd這兩個方法能夠用來讓WEB開發人員測量一個javascript腳本程序執行消耗的時間。隨着WEB應用愈來愈重要,JavaScript的執行性能也日益受到重視,WEB開發人員知道一些性能測試機器是必須的。測試JavaScript性能的方法有不少,但console.time/console.timeEnd兩個方法是最基本、最直接的技巧。
數據結構

  1. console.time方法是開始計算時間
  2. console.timeEnd是中止計時,輸出腳本執行的時間。
  3. 這兩個方法中均可以傳入一個參數,做爲計時器的名稱,它的做用是在代碼並行運行時分清楚各個計時器。
  4. console.timeEnd的調用會當即輸出執行總共消耗的時間,單位是毫秒。
// 啓動計時器
console.time('計時器名稱');

// (寫一些測試用代碼)

// 中止計時,輸出時間
console.timeEnd('計時器名稱');
複製代碼

4、測試性能

在1000000這個級別下,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這個級別下,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級以上的量級上 ,forEach的性能遠遠低於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複製代碼

5、for和forEach的區別

【3.1】遍歷
優化

for循環按順序遍歷,forEach使用iterator迭代器遍歷

【3.2】數據結構

for循環是隨機訪問元素,foreach是順序鏈表訪問元素

【3.3】性能上

對於arraylist,是順序表,使用for循環能夠順序訪問,速度較快;使用foreach會比for循環稍慢一些。
對於linkedlist,是單鏈表,使用for循環每次都要從第一個元素讀取next域來讀取,速度很是慢;使用foreach能夠直接讀取當前結點,數據較快;

6、如何選擇

foreach相對於for循環,代碼減小了,可是foreach依賴IEnumerable。在運行的時候效率低於for循環。固然了,在處理不肯定循環次數的循環,或者循環次數須要計算的狀況下。使用foreach比較方便。並且foreach的代碼通過編譯系統的代碼優化後,和for循環的循環相似。

能夠說,foreach語句是for語句的特殊簡化版本,在遍歷數組、集合方面,foreach爲開發人員提供了極大的方便。在複雜的循環設計時,仍是應該使用for循環更加的靈活。


文章每週持續更新,能夠微信搜索「 前端大集錦 」第一時間閱讀,回覆【視頻】【書籍】領取200G視頻資料和30本PDF書籍資料

相關文章
相關標籤/搜索