lodash some 方法性能为什么比 js 原生方法 还高?

2022-08-01 18:30:09 +08:00
 lqzhgood

今天写一个性能敏感的函数发现的这个有趣结果,lodash some 的性能是 js some 性能的几倍。 我觉得标题加个 [震惊] 都不为过~ /dogo

测试代码

const testArr = new Array(50_000_000).fill({ a: 1, b: 2, c: 3 });

console.time('es');
const x = testArr.some(v => v.a === 9 && v.b === 9 && v.c === 9);
console.timeEnd('es');

console.time('lodash');
const y = _.some(testArr, v => v.a === 9 && v.b === 9 && v.c === 9);
console.timeEnd('lodash');

// es: 590.248046875 ms
// lodash: 219.496826171875 ms

可以在 https://lodash.com/ 的 F12 中直接测试,我在 node16 环境下结果也一致,lodash-some 性能是 js-some 的几倍

js some

按我理解 js RunTime 应该是更高性能语言的实现(如 C 等),那么原生 some 方法性能应该更高呀。

[].some  --> ƒ some() { [native code] }

lodash some

lodash 的 some 源码在这 https://github.com/lodash/lodash/blob/master/some.js,也仅仅是很普通的 while 遍历,不知道为啥性能这么好。

5217 次点击
所在节点    JavaScript
27 条回复
lelouchjoshua
2022-08-02 09:57:08 +08:00
lodash 才是 js 标准库
cjh1095358798
2022-08-02 10:29:03 +08:00
@vace v8 中的数组方法也是 js 写的吗,为啥不用 c++写呢
hangbale
2022-08-02 10:46:24 +08:00
这两个 some 没有可比性,原生实现考虑的东西比 lodash 多太多,
lodash 的 some 比起标准的 some 功能是残缺的,具体可以看 mdn 的文档,
还有其他 lodash 函数比原生性能好的现象,都是类似的情况。
js 数组原生方法的实现,v8 用的是 Torque ,语法类似 typescript ,生成的是 c++代码,历史上也有用手写汇编,C++,self-hosted(用 js 实现 js)实现
Mutoo
2022-08-02 13:07:31 +08:00
关掉 Chrome 的 JIT 测出来的结果:

$ open -a Google\ Chrome --args --js-flags="--jitless"

VM136:3 es: 1210.88330078125 ms
VM152:3 lodash: 2583.97802734375 ms
DICK23
2022-08-02 15:26:08 +08:00
M1 node v16.15.0

es: 356.664 ms
lodash: 104.072ms
manual: 104.843ms
libook
2022-08-02 16:35:52 +08:00
曾经很长一段时间,Bluebird 的卖点之一都是比 V8 原生 ES6 的 Promise 性能好,那时候 V8 每次更新我就会跑一下 benchmark ,见证了原生 Promise 实现的性能越来越好,直至超过 Bluebird 。

估计一些 ES 新特性在引擎里可能会先用 JS 代码简单实现,后面才会再逐渐优化,甚至用 C++重写。
lujiaosama
2022-08-02 16:46:53 +08:00
我用原生不是因为性能, 是因为不想引入 lodash 这个库 , 花里胡哨的 api 一顿操作然后老是被人吐槽看不懂看查文档. 现在就老实用最基础的 map,filter,reduce 来实现功能了.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/870035

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX