Giriş WeakTypeTags:Scala - TypeTags, ClassTags ait çalışma zamanı performansı ve
...
TypeTag[T]
bazı derleme zamanı tipT
çalışma zamanı tip temsilini kapsüller. ...
...TypeTag
s her zaman derleyici tarafından oluşturulur. ... [1]
TypeTag
ler scala.reflect.**
paketlerinde yer almaktadır. Başka bir SO answer, java yansımasını kullanarak uygulamanızda bir çalışma zamanı performans yüküne neden olacağından bahseder.
Soru:
çalışma anında TypeTag
s, ClassTag
s ve WeakTypeTag
s kullanımı java yansıması ne ölçüde yapmak için? Derleme zamanında üretilir, ancak kullanıldığında çalışma zamanı performansına neden olurlar?
Örnek: it çalıştırırken etiketler derleme sırasında oluşturulan rağmen
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]))
, ben gecikme hissedebilirsiniz. Tip karşılaştırmaları, kaputun altındaki performans göstermeyen java yansımasını kullanıyor mu?
Bu durumda, tip karşılaştırmanın genel yükünün önemsiz olduğunu veya mümkün olduğunca kaçınmanızı önerir misiniz? (Bunun biraz öznel olduğunun farkındayım ve sadece mikro ölçütleme doğru bir fikir verebilir). Eşleşme ifadesinden ne haber 'case _: E'? AfaIk 'ClassTag' karşılaştırmaları burada yer alıyorlar, aynı zamanda java yansıması olmadan mı yapılıyorlar? – mucaho
Bu bağlıdır (şok edici, biliyorum). Kendi projemizdeki darboğazlardan biri olduğu için kesinlikle ihmal edilemez. 'Durumunda: E' Java yansıması _is_, ama tüm yansıma yavaş düşünme ve yansıma olmadan tüm kod hızlı olduğunu düşünme tuzağına düşmemelisiniz; özellikle "isInstanceOf" çok hızlıdır, bkz. ör. http://stackoverflow.com/a/397617/9204 –