【发布时间】:2015-04-28 23:30:57
【问题描述】:
对此我们能做些什么?
我已经运行了一些测试,似乎 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/多头)。
性能差异并没有那么大,以至于在大多数用例中都很重要。希望 Scala 将提高他们的地图的速度。同时,如果您需要性能(使用非整数键),请使用 Java。
Int 键,n=20
Long(60)、Java(93)、Open(170)、MutableSc(243)、ImmutableSc(317)
案例对象键,n=20
Java(195),AnyRef(230)
【问题讨论】:
-
如果你要使用 Java 地图,我推荐使用
import scala.collection.JavaConversions._
标签: scala hashmap java-8 scala-2.11