Scala-производительность TypeTags, Classstags и WeakTypeTags во время выполнения


Введение :

... TypeTag[T] инкапсулирует представление типа времени выполнения некоторого типа компиляции T. ...
... TypeTags всегда генерируются компилятором. ... [1]

TypeTags расположены в scala.reflect.** пакеты. Другой SO answer упоминает, что использование отражения java приведет к увеличению производительности во время выполнения в вашем приложении.

Вопрос :
В какой степени TypeTags, ClassTags и WeakTypeTags используют отражение java во время выполнения? Они генерируются во время компиляции, но вызывают ли они накладные расходы на производительность во время выполнения при использовании?

Пример :

def isOfType[A : ClassTag : TypeTag, E : ClassTag : TypeTag](actual: A, expected: E): Boolean = {
  actual match {
    case _ : E if typeOf[A] =:= typeOf[E] => true
    case _ => false
  }
}

assert( isOfType(List.empty[Int], List.empty[Int]))
assert(!isOfType(List.empty[String], List.empty[Int]))
Хотя теги генерируются во время компиляции, я могу чувствовать задержку при его запуске. Используют ли сравнения типов не очень эффективное отражение java под капотом?
1   7   2015-04-18 02:15:32

1 ответ:

Ну, вы можете посмотреть здесь. В вашем случае отражение Java не участвует, но =:= в конечном итоге делегирует isSameType2, что весьма нетривиально. Сначала он проверяет равенство ссылок.