2015-04-17 15 views
7

Giriş WeakTypeTags:Scala - TypeTags, ClassTags ait çalışma zamanı performansı ve

... TypeTag[T] bazı derleme zamanı tip T ç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?

cevap

3

here'a bakabilirsiniz. Sizin durumunuza Java yansıması dahil değildir, ancak =:= sonunda, son derece önemsiz olan isSameType2'a delege eder. İlk önce referans eşitliğini kontrol eder.

+1

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

+2

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 –

İlgili konular