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

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

  •  
  •   lxy · 248 天前 · 1617 次点击
    这是一个创建于 248 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比较以下三者,性能优先,考虑不同的任务量大小、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
        1
    wxkvEX   248 天前 via iPhone
    很明显不是,并行流并不是无脑用的,我遇到过因为并行导致执行错误的情况,没个几十万几百万乖乖用普通的流就行
        2
    yidinghe   248 天前
    如果循环体很小且调用频繁(这类循环属于很细节的操作,通常不会考虑并发),那么用 forEach 或 streaming 可能性能上不划算,还是用 for-index 循环好一点。除此之外我觉得用哪种方式性能上区别不大。

    至于 IO 密集,我觉得对所有的循环方式影响都一样,因为如果瓶颈在 IO 上,那么 CPU 负载就不高。
        3
    richard1122   248 天前
    而且还要注意有没有里面的代码依赖了 thread local,之前我们曾经有逻辑开始用了并行 stream,后来里面某一块改了,依赖了 thread local。
        4
    BBCCBB   248 天前   ♥ 1
    forEach 和 for 一样的,只是提供了一个语法糖而已, 小数据量 for 性能是比 stream 好的,stream 要分解任务,合并结果等。开销较大, 普通的 for 还可以在知道数据量大小的时候优先分配固定的空间。
        5
    asj   247 天前 via Android
    在于函数式写法描述逻辑更清楚的情况下选择 Stream,没有特殊理由不应该特意关注性能。
    如果真的性能是第一位的,那就用 for。要并行完全可以自己手写多个线程分别 for 集合的一部分。
        6
    wizardforcel   247 天前 via Android
    @wxkvEX 这就属于 jvm 的 bug 了。对于相同的方法序列,它们的结果应该相同。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2696 人在线   最高记录 4019   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 21ms · UTC 11:25 · PVG 19:25 · LAX 03:25 · JFK 06:25
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1