Scala 实现固定大小、不可变和专用的向量
为了性能和安全,我想实现一个固定大小的向量,它是不变的和专用的(我需要快速算法)。我的第一个想法是使用Scala 实现固定大小、不可变和专用的向量,scala,autoboxing,specialized-annotation,Scala,Autoboxing,Specialized Annotation,为了性能和安全,我想实现一个固定大小的向量,它是不变的和专用的(我需要快速算法)。我的第一个想法是使用@专用的注释(因为我需要整数和实数) 这里是第一次尝试: package so class Vec[@specialized A] private[so] ( ary: Array[A] ) { def apply( i: Int ) = ary(i) } 但是,当我使用javap分析结果字节码时,我可以看到元素仍然是装箱的。例如: public double apply$mcD$sp(i
@专用的注释(因为我需要整数和实数)
这里是第一次尝试:
package so
class Vec[@specialized A] private[so] ( ary: Array[A] ) {
def apply( i: Int ) = ary(i)
}
但是,当我使用javap
分析结果字节码时,我可以看到元素仍然是装箱的。例如:
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
看起来数组不是专门化的,这看起来很愚蠢,因为数组是在JVM上专门化的
我还能做些什么来达到我的目标吗?您可能正在查看编译到Vec.class的代码。根据特殊化发生在子类中。这可以在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
我想这就是您在使用Int
时想要的,您使用的是什么版本?我用2.9.2看起来不错。我试过用2.9.2和2.8.2。
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