diff options
Diffstat (limited to 'src/library/scala/collection/parallel/ParIterableLike.scala')
-rw-r--r-- | src/library/scala/collection/parallel/ParIterableLike.scala | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/library/scala/collection/parallel/ParIterableLike.scala b/src/library/scala/collection/parallel/ParIterableLike.scala index 0769181150..ff37c89517 100644 --- a/src/library/scala/collection/parallel/ParIterableLike.scala +++ b/src/library/scala/collection/parallel/ParIterableLike.scala @@ -941,7 +941,14 @@ extends IterableLike[T, Repr] result = true } else pit.scanToArray(z, op, array, from) def newSubtask(p: ParIterator) = unsupported - override def shouldSplitFurther = len > size / 2 + override lazy val shouldSplitFurther = { + // we want less work stealings while prefix scanning + // and keep processors busier with merging + // (work stealing while prefix scanning means more work later) + val processors = parallelismLevel min availableProcessors + len > ((size / tweak(processors)) max 1) + } + private def tweak(p: Int) = if (p < 4) 2 else p / 2 override def split = { val pits = pit.split for ((p, untilp) <- pits zip pits.scanLeft(0)(_ + _.remaining); if untilp < len) yield { |