Введение:Scala - производительность Run-время TypeTags, ClassTags и WeakTypeTags
...
TypeTag[T]
инкапсулирует тип выполнения представление некоторого времени компиляции типаT
. ...
...TypeTag
s всегда генерируются компилятором. ... [1]
TypeTag
s расположены в scala.reflect.**
пакетах. Другой SO answer упоминает, что использование java-отражения приведет к чрезмерной нагрузке на производительность в вашем приложении.
Вопрос:
В какой степени TypeTag
с, ClassTag
с и WeakTypeTag
сек использовать 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 под капотом?
Как вы считаете, накладные расходы на сравнение типов в этом случае ничтожны, или вы бы предложили избегать его там, где это возможно? (Я знаю, что это несколько субъективно, и только микро-бенчмаркинг может дать правильное понимание). Как насчет выражения соответствия 'case _: E'? Здесь участвуют сравнения AfaIk 'ClassTag', они также выполняются без отражения java? – mucaho
Это зависит (шокирует, знаю). Это определенно не всегда незначительно, так как это один из узких мест в нашем собственном проекте. В 'case _: E' отражается отражение Java _is_, но вы не должны попадать в ловушку мышления, все отражения медленны, и весь код без отражения быстро; в частности 'isInstanceOf' очень быстро, см., например, http://stackoverflow.com/a/397617/9204 –