summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library/scala/collection/mutable/FlatHashTable.scala2
-rw-r--r--src/library/scala/collection/parallel/mutable/ParHashSet.scala44
-rw-r--r--test/benchmarks/src/scala/collection/parallel/Benchmarking.scala11
-rw-r--r--test/benchmarks/src/scala/collection/parallel/benchmarks/hashtables/ParallelHashTableSets.scala2
-rw-r--r--test/benchmarks/src/scala/collection/parallel/benchmarks/hashtables/ParallelHashTables.scala2
5 files changed, 45 insertions, 16 deletions
diff --git a/src/library/scala/collection/mutable/FlatHashTable.scala b/src/library/scala/collection/mutable/FlatHashTable.scala
index d0d9ce2cf5..51872909ec 100644
--- a/src/library/scala/collection/mutable/FlatHashTable.scala
+++ b/src/library/scala/collection/mutable/FlatHashTable.scala
@@ -68,7 +68,7 @@ trait FlatHashTable[A] extends FlatHashTable.HashUtils[A] {
threshold = newThreshold(_loadFactor, table.size)
val smDefined = in.readBoolean
- if (smDefined) sizeMapInit(table.length)
+ if (smDefined) sizeMapInit(table.length) else sizemap = null
var index = 0
while (index < size) {
diff --git a/src/library/scala/collection/parallel/mutable/ParHashSet.scala b/src/library/scala/collection/parallel/mutable/ParHashSet.scala
index e14fbd7305..5386ae278d 100644
--- a/src/library/scala/collection/parallel/mutable/ParHashSet.scala
+++ b/src/library/scala/collection/parallel/mutable/ParHashSet.scala
@@ -174,17 +174,17 @@ self: EnvironmentPassingCombiner[T, ParHashSet[T]] =>
*/
def insertEntry(insertAt: Int, comesBefore: Int, elem: T): Int = {
var h = insertAt
- if (h == -1) h = index(elemHashCode(elem))
- var entry = table(h)
- while (null != entry) {
- if (entry == elem) return 0
- h = (h + 1) // we *do not* do `(h + 1) % table.length` here, because we don't overlap!!
- if (h >= comesBefore) return -1
- entry = table(h)
- }
- table(h) = elem.asInstanceOf[AnyRef]
- tableSize = tableSize + 1
- nnSizeMapAdd(h)
+ // if (h == -1) h = index(elemHashCode(elem))
+ // var entry = table(h)
+ // while (null != entry) {
+ // if (entry == elem) return 0
+ // h = (h + 1) // we *do not* do `(h + 1) % table.length` here, because we don't overlap!!
+ // if (h >= comesBefore) return -1
+ // entry = table(h)
+ // }
+ // table(h) = elem.asInstanceOf[AnyRef]
+ // tableSize = tableSize + 1
+ // nnSizeMapAdd(h)
1
}
}
@@ -222,15 +222,35 @@ self: EnvironmentPassingCombiner[T, ParHashSet[T]] =>
(elemsIn + leftoversIn, elemsLeft concat leftoversLeft)
}
private def insertAll(atPos: Int, beforePos: Int, elems: UnrolledBuffer[Any]): (Int, UnrolledBuffer[Any]) = {
- var it = elems.iterator
var leftovers = new UnrolledBuffer[Any]
var inserted = 0
+
+ // var unrolled = elems.headPtr
+ // var i = 0
+ // var t = table
+ // while (unrolled ne null) {
+ // val chunkarr = unrolled.array
+ // val chunksz = unrolled.size
+ // while (i < chunksz) {
+ // val elem = chunkarr(i)
+ // val res = t.insertEntry(atPos, beforePos, elem.asInstanceOf[T])
+ // if (res >= 0) inserted += 1
+ // else leftovers += elem
+ // i += 1
+ // }
+ // i = 0
+ // unrolled = unrolled.next
+ // }
+
+ // slower:
+ var it = elems.iterator
while (it.hasNext) {
val elem = it.next
val res = table.insertEntry(atPos, beforePos, elem.asInstanceOf[T])
if (res >= 0) inserted += res
else leftovers += elem
}
+
(inserted, leftovers)
}
def split = {
diff --git a/test/benchmarks/src/scala/collection/parallel/Benchmarking.scala b/test/benchmarks/src/scala/collection/parallel/Benchmarking.scala
index 0eb6c6ef13..32c3ca154f 100644
--- a/test/benchmarks/src/scala/collection/parallel/Benchmarking.scala
+++ b/test/benchmarks/src/scala/collection/parallel/Benchmarking.scala
@@ -109,7 +109,7 @@ trait BenchmarkRegister {
register(hashtries.RefParHashTrieBenches.Map)
register(hashtries.RefParHashTrieBenches.Map2)
- // parallel hash table benchmarks
+ // parallel hash table map benchmarks
register(hashtables.RefParHashTableBenches.Reduce)
register(hashtables.RefParHashTableBenches.Reduce2)
register(hashtables.RefParHashTableBenches.Foreach)
@@ -117,6 +117,15 @@ trait BenchmarkRegister {
register(hashtables.RefParHashTableBenches.Map)
register(hashtables.RefParHashTableBenches.Map2)
register(hashtables.RefParHashTableBenches.HeavyMap)
+
+ // parallel hash table set benchmarks
+ register(hashtables.RefParHashTableSetBenches.Reduce)
+ register(hashtables.RefParHashTableSetBenches.Reduce2)
+ register(hashtables.RefParHashTableSetBenches.Foreach)
+ register(hashtables.RefParHashTableSetBenches.ForeachSet)
+ register(hashtables.RefParHashTableSetBenches.Map)
+ register(hashtables.RefParHashTableSetBenches.Map2)
+ register(hashtables.RefParHashTableSetBenches.HeavyMap)
}
diff --git a/test/benchmarks/src/scala/collection/parallel/benchmarks/hashtables/ParallelHashTableSets.scala b/test/benchmarks/src/scala/collection/parallel/benchmarks/hashtables/ParallelHashTableSets.scala
index 2ac1e1c110..d0b7bae834 100644
--- a/test/benchmarks/src/scala/collection/parallel/benchmarks/hashtables/ParallelHashTableSets.scala
+++ b/test/benchmarks/src/scala/collection/parallel/benchmarks/hashtables/ParallelHashTableSets.scala
@@ -19,7 +19,7 @@ trait ParHashTableSetBenches[T] extends StandardParIterableBenches[T, ParHashSet
val forkJoinPool = new scala.concurrent.forkjoin.ForkJoinPool
object Map2 extends IterableBenchCompanion {
- override def defaultSize = 5000
+ override def defaultSize = 50000
override def comparisons = List()
def benchName = "map2";
def apply(sz: Int, p: Int, w: String) = new Map2(sz, p, w)
diff --git a/test/benchmarks/src/scala/collection/parallel/benchmarks/hashtables/ParallelHashTables.scala b/test/benchmarks/src/scala/collection/parallel/benchmarks/hashtables/ParallelHashTables.scala
index ad2a8750c1..291f7ec62d 100644
--- a/test/benchmarks/src/scala/collection/parallel/benchmarks/hashtables/ParallelHashTables.scala
+++ b/test/benchmarks/src/scala/collection/parallel/benchmarks/hashtables/ParallelHashTables.scala
@@ -19,7 +19,7 @@ trait ParHashTableBenches[K, V] extends StandardParIterableBenches[(K, V), ParHa
val forkJoinPool = new scala.concurrent.forkjoin.ForkJoinPool
object Map2 extends IterableBenchCompanion {
- override def defaultSize = 5000
+ override def defaultSize = 40000
override def comparisons = List("jhashtable")
def benchName = "map2";
def apply(sz: Int, p: Int, w: String) = new Map2(sz, p, w)