2012-04-21 61 views
12

Para el rendimiento y la seguridad, me gustaría implementar un vector de tamaño fijo que sea inmutable y especializado (necesito aritmética rápida). Mi primera idea fue usar la anotación @specialized (porque necesito números enteros y reales).Implementación de un vector de tamaño fijo, inmutable y especializado

Aquí es un primer intento:

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

Sin embargo, cuando se analiza el código de bytes resultante con javap, puedo ver que los elementos todavía están en caja. Por ejemplo:

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 

Parece que las matrices no están especializados que parece tonto, porque las matrices están especializados en la JVM.

¿Hay algo que aún pueda hacer para alcanzar mi objetivo?

+0

¿Qué versión estás usando? Me parece bien con 2.9.2. –

+0

Intenté con ambos 2.9.2 y 2.8.2. – paradigmatic

Respuesta

9

Es probable que esté mirando el código compilado en Vec.class. De acuerdo con this thread la especialización ocurre en subclases. Esto se puede comprobar en el REPL:

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 

Como se puede ver por Int que está utilizando la subclase Vec$mcI$sp. Y si ejecuta javap en esa clase, verá que de hecho está especializando el código correctamente. Esto es lo que el método apply se ve como en Vec$mcI$sp.class usando javap:

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  

que supongo que es lo que quiere cuando se utiliza Int.

Cuestiones relacionadas