为什么普通 for 循环的性能远远高于 forEach 的性能?
首先问题说 for 循环优于 forEach 并不完全正确,循环次数不够多的时候, forEach 性能优于 for
// 循环十万次 let arrs = new Array(100000); console.time('for'); for (let i = 0; i < arrs.length; i++) {}; console.timeEnd('for'); // for: 2.36474609375 ms console.time('forEach'); arrs.forEach((arr) => {}); console.timeEnd('forEach'); // forEach: 0.825927734375 ms
循环次数越大, for 的性能优势越明显
// 循环 1 亿次 let arrs = new Array(100000000); console.time('for'); for (let i = 0; i < arrs.length; i++) {}; console.timeEnd('for'); // for: 72.7099609375 ms console.time('forEach'); arrs.forEach((arr) => {}); console.timeEnd('forEach'); // forEach: 923.77392578125 ms
先做一下对比
对比类型 | for | forEach |
---|---|---|
遍历 | for 循环按顺序遍历 | forEach 使用 iterator 迭代器遍历 |
数据结构 | for 循环是随机访问元素 | forEach 是顺序链表访问元素 |
性能上 | 对于 arraylist,是顺序表,使用 for 循环可以顺序访问,速度较快;使用 foreach 会比 for 循环稍慢一些 | 对于 linkedlist,是单链表,使用 for 循环每次都要从第一个元素读取 next 域来读取,速度非常慢;使用 foreach 可以直接读取当前结点,数据较快 |
结论
for 性能优于 forEach , 主要原因如下:
- foreach 相对于 for 循环,代码减少了,但是 foreach 依赖 IEnumerable。在运行的时候效率低于 for 循环。
- for 循环没有额外的函数调用栈和上下文,所以它的实现最为简单。forEach:对于 forEach 来说,它的函数签名中包含了参数和上下文,所以性能会低于 for 循环。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论