为何普通 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书籍资料