JavaScript/TypeScript 中带有字符串的连续分配数组
Contiguous allocated arrays in JavaScript/TypeScript with strings
我有一个看起来像这样的系统:
interface Data {
x: number;
y: number;
n: string;
}
const array = Array<Data>(100);
我在 Chrome 中读到,如果数组只包含相同的类型,V8 引擎会将对象分配为 C 数组,但是是否可以实际检查我的“数组”对象是否将充当一个 C 数组或字典,例如内存是连续分配的吗?
如果无法做到这一点,我知道我可以使用像这样使用 TypedArrays 的 SoA 模型:
interface Data {
x: Float64Array;
y: Float64Array;
n: ????;
}
const dataArray = {
x: new Float64Array(100),
y: new Float64Array(100),
n: ????????
} as Data
但是我不知道如何在这样的数组中存储字符串
这里是 V8 开发人员。 var dataArray = new Array(100)
将为您提供一个包含 100 个指针的连续数组,因此从这个意义上讲,它将是 "C like",而不是字典。 dataArray[0] = new Data(x, y, n)
将在数组外分配一个新的 Data
对象,并将指向它的指针存储在数组的第一个槽中。在这样的 Data
对象中,在 64 位平台上,V8 可以直接在对象中存储数字(在您的示例中为 x
和 y
),而字符串和其他对象将始终存储作为指向另一个对象的指针。在只包含数字的数组中,V8 也可以将它们直接存储在数组中,因此您不需要为此使用 Float64Array
。
综上所述,任何性能差异都可能太小而不重要,因此我建议您编写对您最有意义的代码(最易读,最适合您的 algorithm/data 模型,等)。
我有一个看起来像这样的系统:
interface Data {
x: number;
y: number;
n: string;
}
const array = Array<Data>(100);
我在 Chrome 中读到,如果数组只包含相同的类型,V8 引擎会将对象分配为 C 数组,但是是否可以实际检查我的“数组”对象是否将充当一个 C 数组或字典,例如内存是连续分配的吗?
如果无法做到这一点,我知道我可以使用像这样使用 TypedArrays 的 SoA 模型:
interface Data {
x: Float64Array;
y: Float64Array;
n: ????;
}
const dataArray = {
x: new Float64Array(100),
y: new Float64Array(100),
n: ????????
} as Data
但是我不知道如何在这样的数组中存储字符串
这里是 V8 开发人员。 var dataArray = new Array(100)
将为您提供一个包含 100 个指针的连续数组,因此从这个意义上讲,它将是 "C like",而不是字典。 dataArray[0] = new Data(x, y, n)
将在数组外分配一个新的 Data
对象,并将指向它的指针存储在数组的第一个槽中。在这样的 Data
对象中,在 64 位平台上,V8 可以直接在对象中存储数字(在您的示例中为 x
和 y
),而字符串和其他对象将始终存储作为指向另一个对象的指针。在只包含数字的数组中,V8 也可以将它们直接存储在数组中,因此您不需要为此使用 Float64Array
。
综上所述,任何性能差异都可能太小而不重要,因此我建议您编写对您最有意义的代码(最易读,最适合您的 algorithm/data 模型,等)。