Kotlin-使用Array <Double>或DoubleArray

马丁·佩里

这两者的主要区别是什么:

val array: Array<Double> = arrayOf()

val array: DoubleArray = doubleArrayOf()

我知道一种使用原始数据类型double,第二种使用基于对象的countrepart Double

使用普通纸是否有任何惩罚或不满意DoubleArray


为什么我想知道:

我正在使用JNI,对于Double,我必须致电

 jclass doubleClass = env->FindClass("java/lang/Double");
 jmethodID doubleCtor = env->GetMethodID(doubleClass, "<init>", "(D)V");
 jobjectArray res = env->NewObjectArray(elementCount, doubleClass, nullptr);

 for (int i = 0; i < elementCount; i++){
    jobject javaDouble = env->NewObject(doubleClass, doubleCtor, array[i]);
    env->SetObjectArrayElement(res, i, javaDouble);
    env->DeleteLocalRef(javaDouble);
 }

jdoubleArray res = env->NewDoubleArray(elementCount);
env->SetDoubleArrayRegion(res, 0, elementCount, array);
莫伊拉

没有任何代价(实际上,由于没有装箱,它会更快),但是,与Java中的原始类型一样,如果您希望将它们与一起使用,它将迫使您为某些方法创建专门的重载[Int/Double/etc]Array

实际上,在Kotlin论坛上已经对此进行了讨论

整数数组的内存布局与对象指针数组的内存布局完全不同。

Norswap在该讨论中的评论很好地总结了权衡:

原生的[ int[]/ IntArray]读/写速度更快,但是包装的[ Integer[]/ Array<Int>]不需要在每次跨越通用边界时都进行完全转换。
#7,norswap

例如,接受Array<Int>Integer[]在JVM上)的函数接受IntArrayint[])。

您已经列出了唯一的实际区别,其中一个被编译为原始类型,另一个被编译double[]Double[]但是,Double[]是一个对象数组,因此double每次您通过将值设置为来修改数组或检索时double,将分别执行装箱和拆箱。

DoubleArray出于速度和内存原因,通常建议改用它

作为对象包装器造成的速度损失的示例,请看一下这篇文章的开头,摘自Effective Java:

public static void main(String[] args) {
    Long sum = 0L; // uses Long, not long
    for (long i = 0; i <= Integer.MAX_VALUE; i++) {
        sum += i;
    }
    System.out.println(sum);
}

替换Longlong可使运行时间从43秒降低到8秒。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章