2012-04-21 9 views
12

Performans ve güvenlik için hem sabit hem de uzmanlık gerektiren sabit boyutlu bir vektör uygulamak istiyorum (hızlı aritmetik ihtiyacım var). İlk düşüncem @specialized ek açıklamasını kullanmaktı (çünkü hem tamsayılara hem de sonuçlara ihtiyacım var). Ben javap ile sonuçlanan bayt kodu çözümlemekSabit boyutlu, değişmez ve özel bir vektörün uygulanması

package so 
class Vec[@specialized A] private[so] (ary: Array[A]) { 
    def apply(i: Int) = ary(i) 
} 

Ancak, ben elemanlar hala kutulu olduğunu görebilirsiniz: Burada

bir ilk deneyin. Örneğin:

diziler diziler JVM üzerinde uzmanlaşmış, çünkü saçma görünüyor uzman değildirler gibi görünüyor
public double apply$mcD$sp(int); 
    Code: 
    0: aload_0 
    1: iload_1 
    2: invokevirtual #33; //Method apply:(I)Ljava/lang/Object; 
    5: invokestatic #83; //Method scala/runtime/BoxesRunTime.unboxToDouble:(Ljava/lang/Object;)D 
    8: dreturn 

.

Hedefime ulaşmak için hala yapabileceğim bir şey var mı?

+0

Hangi süreyi kullanıyorsunuz? 2.9.2 ile benim için iyi görünüyor. –

+0

Hem 2.9.2 hem de 2.8.2 ile çalıştım. – paradigmatic

cevap

9

Vec.class'a derlenmiş olan kodu inceliyorsunuzdur. this thread'a göre uzmanlaşma alt sınıflarda gerçekleşir. Bu Çoğaltma içinde doğrulanabilir:

scala> class Vec[@specialized A] (ary: Array[A]) { 
    | def apply(i: Int) = ary(i) 
    | } 
defined class Vec 

scala> new Vec(Array[Int](1)).getClass 
res0: java.lang.Class[_ <: Vec[Int]] = class Vec$mcI$sp 

bunu alt sınıf Vec$mcI$sp kullanıyor Int için görebileceğiniz gibi. Ve eğer javapı bu sınıfta çalıştırırsanız, kodun doğru bir şekilde uzmanlaşmasının etkili olduğunu göreceksiniz. Bu javap kullanarak Vec$mcI$sp.class gibi yöntem görünüyor uygulamak budur: herhalde

public int apply(int); 
    flags: ACC_PUBLIC 
    Code: 
     stack=2, locals=2, args_size=2 
     0: aload_0  
     1: iload_1  
     2: invokevirtual #13     // Method apply$mcI$sp:(I)I 
     5: ireturn  

Int kullanırken istediğiniz şeydir.

İlgili konular