В scala, почему Range.hashCode () такой медленный и не может быть сделан быстрее? - PullRequest
0 голосов
/ 26 апреля 2019

Учитывая следующий код:

  def timed[T](fn: => T): (T, Long) = {
    val startTime = System.currentTimeMillis()
    val result = fn
    val endTime = System.currentTimeMillis()
    (result, endTime - startTime)
  }

val t1 = timed((0 until Int.MaxValue).hashCode())
val t2 = timed((0, Int.MaxValue).hashCode())

print(t1 + " : " + t2)

Теоретически скорость hashCode () диапазона может быть сделана сопоставимой с кортежем, вместо этого разница в скорости ошеломляет:

(201341306,5274) : (-281813831,0)

Оказывается, Range наследует реализацию IndexSeq hashCode (), которая требует полной итерации.У меня вопрос, можно ли сделать это быстрее?Что мешает его внедрению?

1 Ответ

2 голосов
/ 26 апреля 2019

В стандартной библиотеке scala все последовательные коллекции считаются equal, если их содержимое равно.

Vector(1,2,3) == List(1,2,3) //true

И из-за equals / hashcode хеш-код контракта должен вычисляться одинаково для каждого типа коллекции.

...