|
|
1
9
你可以有一些方便的函数,也可以有线程安全的版本来并行工作。
不过,我觉得不值得。这些包装纸寿命短,所以不太可能离开年轻一代,所以会很快被垃圾收集 . 不过,我认为这个想法值得商榷 micro-benchmark library JMH |
|
|
2
11
您的方法碰巧起作用,因为流管道只包含无状态操作。在这样的星座中,顺序流求值一次可以处理一个元素,因此对包装器实例的访问不会重叠,如 illustrated here
它肯定不适用于像这样的有状态操作
换句话说,如果您想使用这种可变包装器,最好使用一个实现特定操作的循环。您已经有了这样一个手动实现的缺点,那么为什么不实现它来获得优点呢。 要考虑的另一个方面是,重用这样一个可变的包装器会带来什么好处。它只适用于在应用转义分析之后临时对象可能会得到优化的类似循环的用法。在这种情况下,重用对象,延长其生命周期,实际上可能会降低性能。 当然,对象规模化并不是一种可以保证的行为。可能有一些场景,比如长流管道超过JVMs内联限制,对象不会被省略。不过,临时物品并不一定昂贵。 这一点已在中作了解释 this answer . 临时对象的分配很便宜。垃圾回收的主要成本是由仍然存在的对象造成的。在为新的分配腾出空间时,这些需要遍历,这些需要移动。临时对象的负面影响是它们可能会缩短垃圾回收轮之间的时间。但这是分配率和可用分配空间的函数,因此这确实是一个问题,可以通过向其添加更多RAM来解决。RAM越多意味着GC循环之间的时间越长 和 当GC发生时,会有更多的死对象,这使得GC的净成本更小。
不过,避免过度分配临时对象是一个值得关注的问题。存在
因此,如果同样存在这样一个问题,即语义上等价的包装器对象在没有实质性问题的情况下避免了替换,比如只使用
简言之,大多数情况下,这种对象重用的节省(如果有的话)并不能证明其缺点。在特殊的情况下,如果它是有益的和重要的,您最好使用一个循环或任何其他由您完全控制的构造,而不是使用
|
|
|
3
4
尽管这是可能的,但引用流之外的对象会使代码在样式上不那么实用。通过一个helper函数就可以实现一个非常接近的等价物,该等价物封装得更好:
|