获取(并行)流的状态

whi*_*cko 2 java parallel-processing java-8

有没有办法监控执行resp.在Java 8中收集/减少并行Stream?我想知道,已经处理了多少元素.

在顺序编程中,我可以用for循环完成整个任务并添加一些计数器,我可以不时地打印到stdout,看看需要多长时间.但对于并行流,我没有看到任何简单直接的方法来做同样的事情.

Bri*_*etz 6

您可以使用该peek()方法来观察元素.如果正在并行处理流,您将从正在处理元素的所有线程中获取这些调用.

也就是说,它可能不是一个聪明的主意.首先,你必须应对线程安全问题; 如果要保持某种全局计算状态,则必须使用某种同步来保持一致,否则收集的任何统计信息都将毫无意义.并且这种协调会杀死并行性给你的大部分(或者更多)所带来的好处,因为现在你将有多个线程一直争夺锁,当时要让这些单独的线程自由运行在数据的不相交部分.这是一个示例,您希望观察计算将极大地改变其性能特征.

请记住,并行性纯粹是一种优化 - 使用并行性的唯一价值就是更快地得到答案.但是如果你要像这样将处理器鞋带系在一起,你就不会得到这样的好处.

  • `LongAdder`可能适用于此.当然,它会增加开销,这可能会很大,具体取决于工作负载的特性.测量,不要猜测等 (3认同)