可以做些什么呢?
我已经运行了一些测试,似乎 Scala Hashmap 比 Java HashMap 慢得多。请证明我错了!
对我来说,Hashmap 的重点是快速访问给定键的值。因此,当速度很重要时,我发现自己求助于使用 Java HashMap,这有点令人难过。我没有足够的经验可以肯定地说,但似乎你将 Java 和 Scala 混合得越多,你可能面临的问题就越多。
test("that scala hashmap is slower than java") {
val javaMap = new util.HashMap[Int,Int](){
for (i <- 1 to 20)
put(i,i+1)
}
import collection.JavaConverters._
val scalaMap = javaMap.asScala.toMap
// check is a scala hashmap
assert(scalaMap.getClass.getSuperclass === classOf[scala.collection.immutable.HashMap[Int,Int]])
def slow = {
val start = System.nanoTime()
for (i <- 1 to 1000) {
for (i <- 1 to 20) {
scalaMap(i)
}
}
System.nanoTime() - start
}
def fast = {
val start = System.nanoTime()
for (i <- 1 to 1000) {
for (i <- 1 to 20) {
javaMap.get(i)
}
}
System.nanoTime() - start
}
val elapses: IndexedSeq[(Long, Long)] = {
(1 to 1000).map({_ => (slow,fast)})
}
var elapsedSlow = 0L
var elapsedFast = 0L
for ((eSlow,eFast) <- elapses) {
elapsedSlow += eSlow
elapsedFast += eFast
}
assert(elapsedSlow > elapsedFast)
val fraction : Double = elapsedFast.toDouble/elapsedSlow
println(s"slower by factor of: $fraction")
}
我错过了什么吗?
答案摘要
截至目前,当比较 Java 8 和 Scala 2.11 时,Java HashMap 似乎在查找(对于少量键的情况下)比 Scala 产品更快——除了 LongMap(如果您的键是 Ints/Longs)。
性能差异并没有那么大,以至于在大多数用例中都很重要。希望 Scala 将提高他们的地图的速度。同时,如果您需要性能(使用非整数键),请使用 Java。
整数键,n=20
Long(60),Java(93),Open(170),MutableSc(243),ImmutableSc(317)
案例对象键,n=20
Java(195),AnyRef(230)