gpt4 book ai didi

arrays - Kotlin - 使用 Array 或 DoubleArray

转载 作者:行者123 更新时间:2023-12-02 12:36:13 26 4
gpt4 key购买 nike

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

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 .

This has actually been discussed over at the Kotlin forums :

the memory layout of an array of integers is quite different from that of an array of object pointers.

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

The native one [int[]/IntArray] is faster to read/write, but the wrapped [Integer[]/Array<Int>] does not need to be entirely converted each time it crosses a generic boundary.
#7, norswap

例如,一个函数接受 Array<Int> (在 JVM 上为 Integer[])将接受 IntArray (int[])。

你已经列出了唯一真正的区别,那个被编译成原语 double[]另一个给Double[] .然而,Double[]是一个objects 数组,所以任何时候你通过将值设置为 double 来修改数组,或检索 double , 将分别进行装箱和拆箱。

通常推荐使用DoubleArray相反,出于速度和内存的原因。

作为对象包装器导致的速度损失的示例,请查看 this 的开头帖子,摘自 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 秒。

关于arrays - Kotlin - 使用 Array<Double> 或 DoubleArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49391973/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com