2015-04-17 2 views
7

Введение: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 под капотом?

ответ

3

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

+1

Как вы считаете, накладные расходы на сравнение типов в этом случае ничтожны, или вы бы предложили избегать его там, где это возможно? (Я знаю, что это несколько субъективно, и только микро-бенчмаркинг может дать правильное понимание). Как насчет выражения соответствия 'case _: E'? Здесь участвуют сравнения AfaIk 'ClassTag', они также выполняются без отражения java? – mucaho

+2

Это зависит (шокирует, знаю). Это определенно не всегда незначительно, так как это один из узких мест в нашем собственном проекте. В 'case _: E' отражается отражение Java _is_, но вы не должны попадать в ловушку мышления, все отражения медленны, и весь код без отражения быстро; в частности 'isInstanceOf' очень быстро, см., например, http://stackoverflow.com/a/397617/9204 –

Смежные вопросы