V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
1oNflow
V2EX  ›  Java

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

  •  
  •   1oNflow · 2019-10-05 13:59:27 +08:00 via iPhone · 4109 次点击
    这是一个创建于 1657 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有的题目把 for 循环用 IntStream 改写一下,运行耗时直接从 1ms 变成 40ms,虽然代码更短更清晰了,但是不敢用,怕超时啊…

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

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

    反观 go 语言,在可预见的未来会比 java 还慢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3380 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 00:06 · PVG 08:06 · LAX 17:06 · JFK 20:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.