-
Notifications
You must be signed in to change notification settings - Fork 3.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
第 72 题:为什么普通 for 循环的性能远远高于 forEach 的性能,请解释其中的原因 #121
Comments
它不是普通的 for 循环的语法糖,还有诸多参数和上下文需要在执行的时候考虑进来,这里可能拖慢性能; |
@yygmind 想问问题目中的截图,测试JS运行时间或者性能的网站,可以给个地址吗? |
另外也推薦 jsbench.github.io,都很好用。 |
|
这是地址是截图的测试地址: |
为哈我测试出来foreach更高呢 chrome版本越高 性能越好 |
牛逼 |
for循环本来就是最原始的循环方案 foreach是基于它封装的 |
为什么 |
@jjeejj 我理解是普通的业务需求没有那么大的数组,所以性能差距很小。 |
@mm-bt 第一个测试我也是forEach稍微快一丝丝,记得以前看过说针对forEach的实现是改过的.. |
我之前用浏览器的做的实验,现在改为 let arrs = new Array(100000);
console.time('for');
for (let i = 0; i < arrs.length; i++) {
};
console.timeEnd('for');
console.time('forEach');
arrs.forEach((arr) => {
});
console.timeEnd('forEach');
for: 2.263ms
forEach: 0.254ms 在10万这个级别下, for: 2.263ms
forEach: 0.254ms 在100万这个量级下, for: 2.844ms
forEach: 2.652ms 在1000万级以上的量级上 , for: 8.422ms
forEach: 30.328m |
我也是,单独跑时间的话,是 forEach 快些,但是用那些性能测试工具的话,就是 for性能更好 |
@jjeejj var number = 100000;//array大小
var iteranum = 10;//迭代次数
var array = [];
for(let i=0;i<number;i++)
{
array[i] = i+1;
}
//test cicle
var len = array.length;
//正常for循环
console.time('normal for');
for(let k=0;k<iteranum;k++)
{
for(let i=0;i<len;i++)
{
array[i]+1;
}
}
console.timeEnd('normal for');
//倒序for循环
console.time('reverse for');
for(let k=0;k<iteranum;k++)
{
for(let i=len-1;i--;)
{
array[i]+1;
}
}
console.timeEnd('reverse for');
//while循环
console.time('while');
for(let k=0;k<iteranum;k++)
{
let i=0;
while(i<len)
{
array[i]+1;
i++;
}
}
console.timeEnd('while');
//for-in循环
console.time('for-in');
for(let k=0;k<iteranum;k++)
{
for(let i in array)
{
array[i]+1;
}
}
console.timeEnd('for-in');
//for each 循环
console.time("for each");
for(let k=0;k<iteranum;k++)
{
array.forEach(function(e){
e+1;
});
}
console.timeEnd("for each");
//map 循环
console.time("map");
for(let k=0;k<iteranum;k++)
{
array.map(function(e){
e+1;
});
}
console.timeEnd("map"); |
@jjeejj 看到过一个说法,forEach能让代码更为简便和可读性更高,在性能不是特别影响的前提下,代码的可拓展性,可读性等会更为重要,而且随着浏览器引擎的升级,应该forEach的性能会被优化的越来越棒的 |
简单去看,就是手动控制循环次数,和方法判定结束,肯定是不一样的 |
for循环是常见的循环语句forEach和map是在ES5出的,但是在性能上后者不如前者,在次数少的情况下forEach会比for要快,但是到达了十万次时forEach明显就跟不上了。在大数据量的情况下for循环的兼容性和多环境运行表现比较优秀,forEach的优点是在数据量小时占优势,语义话更简洁。循环时没有返回值。map和forEach差不多但是map循环有返回值 |
在chrome浏览器上测了一下,当数组length超过3355443时,forEach的耗时是超过for循环的 |
一个是判断数组的长度,一个是 判断对象的长度,还有判断对象里面有没有数组下标这个key, |
我猜forEach需要的额外内存使得重复实验时触发了垃圾回收,因此稍慢于for |
你这个测试里forEach函数里的方法应该是一次都没被调用过 所以执行时间较短 |
for循环是底层写法,效率高。 console.time('for'); |
可读性确实很重要,另外函数式编程也是趋势。 |
其实你这个测试方法有点小问题,for循环这样写会影响性能的,for (let i = 0; i < arrs.length; i++)每次循环都会计算arrs的长度,你可以改成for (let i = 0, let len = arrs.length; i < len; i++)再试一下。 |
v8 新版本其实现在性能上已经差不多了。但是forEach需要额外的内存和函数调用。不过新版本得v8给优化了。 |
|
foreach效率比for低主要分2个角度说。 |
我咋觉得哥们走错片场了 |
forEach是声明式函数,我们不用关心内部如何去实现的;for循环是命令式函数,我们告诉计算器如何去做 |
foreach 循环性能1000000下不差吧
…------------------ 原始邮件 ------------------
发件人: "冰洋Zz"<notifications@github.com>;
发送时间: 2020年1月12日(星期天) 晚上11:26
收件人: "Advanced-Frontend/Daily-Interview-Question"<Daily-Interview-Question@noreply.github.com>;
抄送: "杭州电子科技大学-胡大昌"<707555326@qq.com>;"Comment"<comment@noreply.github.com>;
主题: Re: [Advanced-Frontend/Daily-Interview-Question] 第 72 题:为什么普通 for 循环的性能远远高于 forEach 的性能,请解释其中的原因 (#121)
为什么 forEach 的性能那么差,为什么还要有这个方法呢?难道就是为了方便?
forEach是声明式函数,我们不用关心内部如何去实现的;for循环是命令式函数,我们告诉计算器如何去做
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub, or unsubscribe.
|
|
既然foreach没法终止(try catch)。没有for循环性能好,为啥大家大家还用呢 |
对于高票的答案稍微改造了下, 上面有同学提出 new Array(N) 对于forEach来讲是不会循环的. 所以改造了下 数组的创建方式. 另外for循环中也做了些改造. 现在的测试结果基本就很明显了. 10万次循环的对比结果: let arrs = Array.from({length: 100000});
console.time('for');
let len = arrs.length;
for (let i = 0; i < len; i++) {
};
console.timeEnd('for');
console.time('forEach');
arrs.forEach((arr) => {
});
console.timeEnd('forEach');
for: 2.68310546875ms
forEach: 2.286376953125ms 100万次的对比结果 for: 2.40771484375ms
forEach: 15.508056640625ms 1000万次的对比结果 for: 7.268798828125ms
forEach: 153.18212890625ms |
为什么普通 for 循环的性能远远高于 forEach 的性能,请解释其中的原因
|
赛高! |
如果按照之前的方法测试确实如此,不过给数组填充内容后,10万的数据量结果相差甚微,在100万数据量for循环大于forEach let arrs = new Array(100000).fill(1);
console.time('for');
let for1 = []
for (let i = 0; i < arrs.length; i++) {
for1.push(arrs[i])
};
console.timeEnd('for');
console.time('forEach');
let for2 = []
arrs.forEach((arr, index) => {
for2.push(arr)
});
console.timeEnd('forEach');
for: 2.760986328125 ms
forEach: 2.88427734375 ms |
在 node 和浏览器环境下,小于百万级的数据遍历,我这边测出来的结果始终是 forEach 优于 for |
一样的 不管是先赋值还是直接判断length都是上面的结论。 甚至在一千万时赋值length比直接判断耗时更长, 有点搞不懂 |
如果 使用 当仅仅是 |
这个问题有点问题,Chrome环境for比forEach快、Safari两种方式差异不明显、node环境forEach比for快 |
let arrs = new Array(100000); console.time('forEach'); arrs.forEach((arr) => { }); for: 1ms |
No description provided.
The text was updated successfully, but these errors were encountered: