OJ 平台上同样代码逻辑如果使用 Java8 的 lambda 和 Stream 特性耗时会多很多

2019-10-05 13:59:27 +08:00
 1oNflow
有的题目把 for 循环用 IntStream 改写一下,运行耗时直接从 1ms 变成 40ms,虽然代码更短更清晰了,但是不敢用,怕超时啊…

这是因为 OJ 一般只会跑一次,初始化很耗时吗?
4116 次点击
所在节点    Java
13 条回复
lihongjie0209
2019-10-05 14:05:44 +08:00
你看一下 stream 的内部实现就知道了, 当然耗时啊。
Aresxue
2019-10-05 14:12:43 +08:00
刷题的时候语法糖和黑魔法就不要用了,不要求代码的优雅型,不然性能说不定会有损耗
wwqgtxx
2019-10-05 14:45:57 +08:00
刷题为了速度都是提前开好大数组然后从来不做类型检查的,真实程序谁这么搞怕是会被打死
Mirage09
2019-10-05 15:17:36 +08:00
lambda 的耗时也很大,但是每次写 comparator 都会被 IntelliJ IDEA 提示改成 lambda...
pwrliang
2019-10-05 16:20:30 +08:00
是的,昨天刷 Leetcode 遇到了,使用 IntStream 求 min 发现 46ms,换成 for 之后 5ms。lambda 封装了好多层,在工程上用用没问题,刷题的话还是用 for 吧,否则容易 TLE。
SoloCompany
2019-10-05 17:06:15 +08:00
lambda 和 stream 怎么能等同?哪来的证据支持你说 lambda 耗时?
Jrue0011
2019-10-05 23:02:27 +08:00
是因为多了几层函数调用吧
Raymon111111
2019-10-05 23:14:58 +08:00
没有经过 jit 优化的代码讨论性能意义不太大
chocotan
2019-10-06 11:19:35 +08:00
再怎么语法糖你这从 1ms 到 40ms 也太夸张了,严重怀疑是代码写的有问题
nosilence
2019-10-06 14:02:27 +08:00
@chocotan #9 实际上不夸张,你自己本地分别用 for 和 stream 试一下,就是差这么多
zhady009
2019-10-06 22:37:47 +08:00
@nosilence 怎么测试的? 我这边就快了 1ms..
zhady009
2019-10-06 22:44:08 +08:00
@nosilence 换了下 jdk 版本 jdk12 快 1ms jdk8 40ms
Sasasu
2019-10-07 21:29:05 +08:00
异步流式 builder api 除了写法发生变化,有时候增加或者减轻了心智负担外还有个优点。
这些 api 都增强了语义,编译器能更好的理解你想干嘛,优化力度能开的很大。

比如 steaming api,业务要先 zap 再算加法,再 zap 再算除法。传统 api 要遍历好几遍,streaming 遍历一遍就算出来,对 cpu 缓存友好几倍。

反观 go 语言,在可预见的未来会比 java 还慢

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

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

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

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

© 2021 V2EX