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

Java8 Stream API 在什么情况下适用?

  •  
  •   lxy · 2018-04-14 12:00:26 +08:00 · 3247 次点击
    这是一个创建于 2414 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比较以下三者,性能优先,考虑不同的任务量大小、IO 密集、CPU 密集

    for vs forEach vs (parallelStream + forEach)

    我觉得 forEach + parallelStream 性能最好( for 次之),毕竟有并发执行,应该比单线程的 for 或 forEach 快。但是我找到的文章比较的要么是 for vs forEach,要么是 stream vs parallelStream,有没有 for vs (forEach + parallelStream )的?

    是不是在任何可并发执行的情况下 parallelStream + forEach 都是最优选择?

    6 条回复    2018-04-15 17:44:12 +08:00
    wxkvEX
        1
    wxkvEX  
       2018-04-14 12:29:51 +08:00 via iPhone
    很明显不是,并行流并不是无脑用的,我遇到过因为并行导致执行错误的情况,没个几十万几百万乖乖用普通的流就行
    yidinghe
        2
    yidinghe  
       2018-04-14 12:29:54 +08:00
    如果循环体很小且调用频繁(这类循环属于很细节的操作,通常不会考虑并发),那么用 forEach 或 streaming 可能性能上不划算,还是用 for-index 循环好一点。除此之外我觉得用哪种方式性能上区别不大。

    至于 IO 密集,我觉得对所有的循环方式影响都一样,因为如果瓶颈在 IO 上,那么 CPU 负载就不高。
    richard1122
        3
    richard1122  
       2018-04-14 13:49:56 +08:00
    而且还要注意有没有里面的代码依赖了 thread local,之前我们曾经有逻辑开始用了并行 stream,后来里面某一块改了,依赖了 thread local。
    BBCCBB
        4
    BBCCBB  
       2018-04-14 18:25:45 +08:00   ❤️ 1
    forEach 和 for 一样的,只是提供了一个语法糖而已, 小数据量 for 性能是比 stream 好的,stream 要分解任务,合并结果等。开销较大, 普通的 for 还可以在知道数据量大小的时候优先分配固定的空间。
    asj
        5
    asj  
       2018-04-15 08:03:23 +08:00 via Android
    在于函数式写法描述逻辑更清楚的情况下选择 Stream,没有特殊理由不应该特意关注性能。
    如果真的性能是第一位的,那就用 for。要并行完全可以自己手写多个线程分别 for 集合的一部分。
    wizardforcel
        6
    wizardforcel  
       2018-04-15 17:44:12 +08:00 via Android
    @wxkvEX 这就属于 jvm 的 bug 了。对于相同的方法序列,它们的结果应该相同。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2966 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 00:10 · PVG 08:10 · LAX 16:10 · JFK 19:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.