我们开发了一个使用 Java8 并行流的 API 调用,我们获得了非常好的性能,在进行压力测试时与顺序处理相比几乎翻了一番。
我知道这取决于用例,但我将它用于加密操作,所以我认为这是一个很好的用例。
但是,我已经阅读了很多鼓励对它们非常小心的文章。还有一些文章讨论它们内部设计得不是很好,比如这里。
因此:并行流生产准备好了吗?它们是否广泛用于生产系统?
我们开发了一个使用 Java8 并行流的 API 调用,我们获得了非常好的性能,在进行压力测试时与顺序处理相比几乎翻了一番。
我知道这取决于用例,但我将它用于加密操作,所以我认为这是一个很好的用例。
但是,我已经阅读了很多鼓励对它们非常小心的文章。还有一些文章讨论它们内部设计得不是很好,比如这里。
因此:并行流生产准备好了吗?它们是否广泛用于生产系统?
这个问题邀请“意见”;但我尽量以事实为基础回答。
这些课程并不新鲜!如您所见,它们已经在 Java 1.7 中引入。换句话说:这些课程已经存在好几年了;并在很多地方使用。因此:低风险。
在 Java 术语中是“最近”添加的(请记住 2017 年有多少遗留 Java;以及 [与其他语言相比]Java 的发展速度有多慢)。我认为这里的简单答案是:我们还不知道并行流是否会成为 Java 编程的“基石”,或者人们是否会在某个时候更喜欢其他方法来解决并行流解决的问题。
除此之外:其他语言(如 JavaScript)的用户习惯于几乎“每月”“换档”(又名框架)。这意味着大量的流失,但这也意味着“好东西”被迅速应用;比如:为什么要推迟改进?!
我的意思是:当您发现并行流可以帮助您提高性能时;当您的团队同意“是的,我们可以处理编写代码的流()方式”时......然后继续前进。
换句话说:当并行流帮助您的团队/产品“变得更好”时,为什么不尝试利用它呢?现在,不是 12 或 24 个月。
如果流“不是那么大的东西”;那么好吧,也许你必须在将来的某个时候重写一些代码。
长话短说:这是关于平衡潜在风险和潜在收益。看来您已经取得了一些积极的经验;所以我认为一个合理的折衷方案是:应用流,但以一种受控的方式。所以,后来的决定“错误的转向,摆脱他们”并不会变得太昂贵。
既然我写了你链接到的文章,我应该说几句话。
正如其他人所说,试试看。Parallel Streams 想要拆分成平衡树:拆分左、右、左、右。我这样做了,那么性能就很好。如果没有,那么性能很糟糕。
该框架使用二元递归除法。流是线性的。那不是一个很好的匹配。永远不要忘记音量会改变一切。将缩放添加到组合中可能会让您感到惊讶,但您在尝试之前不会知道。
让我们知道它是如何工作的。