感觉这次写的库能比 js 原生数组方法要快

2021-03-06 16:44:41 +08:00
 hupo0

no-stream 似乎比 js 原生数组方法快

正在等待被锤的忐忑心理中。

3826 次点击
所在节点    JavaScript
28 条回复
hupo0
2021-03-07 00:34:06 +08:00
@musi 所以用了似乎,实际上,如果要提高代码的表达,很多时候不会选择把逻辑都挤在一个循环里,至少我是这样的。
civet
2021-03-07 00:59:17 +08:00
@molika js 不是天生就是为函数式编程服务的,而是社区各路大神引领了这种潮流,实际上就是底层没实现,写法先出现
Rocketer
2021-03-07 01:58:30 +08:00
js 聊性能的意义不是特别大,毕竟主要用途是前端,数组大小不会超过 100 条。相比较而言,节约代码提高开发效率更受欢迎。

真要用在后端处理大数据,那还是像 Python 那样用 C 做类库,让 js 调用吧,纯 js 再努力也提升不了太多
darknoll
2021-03-07 11:59:43 +08:00
没有意义,前端无需注重效率,数据量大了应该是分页之类的,反正 Iterable 对象我都用 for of,我也知道 for 循环速度最快。
wxsm
2021-03-07 23:27:09 +08:00
从算法角度来说,1 次循环,3 次循环,n 次循环,时间复杂度都是 O(n),并没有实质区别。
cenbiq
2021-03-08 12:27:49 +08:00
不禁感慨,C#的 Linq 真是有远见
hupo0
2021-03-08 13:47:21 +08:00
@cenbiq 看看所谓的 Zero cost abstraction - 刘雨培的文章 - 知乎
https://zhuanlan.zhihu.com/p/24975048
吐槽 C# - 刘雨培的文章 - 知乎
https://zhuanlan.zhihu.com/p/30653282

参考这两篇回答,17 年的 C#还没有对 linq 进行优化。虽然用迭代器也是相当于只遍历一遍,但是迭代器“调用”迭代器的过程还是会有额外的性能损耗。完美一点的是,能做到跟 C++一样,把迭代器 yield 的逻辑内联到一个循环里。

想来 no-stream 的做法,是函数调用层面,把"yield"部分通过函数包函数的方式合并到一个循环里。虽然也是有函数调用方面的开销,但目前来看,会比 JS 的 Generator 还节省性能些。

从现有的 C++和 Rust 的案例来看,其实正道还是 iterator,似乎这样的结构更容易优化。linq 也是在正道上,只是需要引擎对这部分进行优化。与之对应的是 JS 的 Generator 。可惜就是目前他们还很拉胯。
cenbiq
2021-03-08 14:10:31 +08:00
@hupo0 用 yield 肯定会产生额外性能损耗嘛。js 是有 Generator 但是我接触下来应用很少,反观 C# IEnumerable 和 IEnumerator 几乎是必不可少的东西,no-stream 类似 rx 管道吧,收集操作最后一次循环执行,无非就是这些方法了。
不过还是得夸 linq,想当初换到 js 和 java 各种不习惯。

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

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

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

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

© 2021 V2EX