И что можно сделать с этим?
Я провел несколько тестов, и кажется, что 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.
Int, n = 20
Длинные (60), Java (93), Open (170), MutableSc (243), ImmutableSc (317)
ключи объекта объекта, n = 20
Java (195), AnyRef (230)