gpt4 book ai didi

javascript - 在 V8 中扩展 JavaScript 数组并维护 PACKED 类型

转载 作者:行者123 更新时间:2023-12-01 00:51:27 24 4
gpt4 key购买 nike

我读过packed arrays in the V8 engine并希望在我的游戏的一些性能关键部分中使用它们(例如作为粒子的容器)。

我想创建一个 Array 的自定义子类,它始终保持 PACKED 状态,但似乎不可能用另一个数组扩展 self。

class PackedArray extends Array {
constructor() {
super();
}

extend(values) {
// `values` is another array.
// This obviously won't work, is there another way?
this = this.concat(values);
}
}

有没有办法在 V8 中扩展子类数组实例并维护 PACKED 类型?

我知道我可以一一推送值,甚至可以调用 this.push(...values),但它比 .concat() 慢并且失败大数组。

最佳答案

V8 开发人员在这里。 TL;DR:对于“打包元素”你能做的最好的事情就是不用担心它们。差异几乎无法衡量。

在某些微基准测试中,热核心循环的优化代码中只有少数机器指令,每条指令都很重要,并且当前元素的“漏洞”检查是否是其中之一(实际上是两个) :cmp + je(在 x86 上),然后跟踪哪些阵列不需要它可能会影响基准测试分数。但在实际应用程序中,您对数组元素执行重要操作,两条机器指令的影响是无法衡量的。您对自定义包装器类进行的任何扭曲很可能比您可能节省的一点点开销还要昂贵。

<小时/>

您提出的具体问题可以通过选择“has-a”而不是“is-a”组合来解决:

class PackedArray {
extend(values) {
this.#data = this.#data.concat(values);
}
get(i) { return this.#data[i]; }

#data = [];
}

这也将解决使用子类时代码仍然可以使用 my_packed_array[10000] = "now you have holes" 的问题。回避.extend()方法。但是,请记住我上面写的内容:孔检查的影响很小,并且任何这些额外的包装所花费的成本可能远远超过其节省的成本。

编辑:@MathiasBynens 写的也是一个非常好的观点:不要为 V8 优化,让 V8 为你优化! :-)

关于javascript - 在 V8 中扩展 JavaScript 数组并维护 PACKED 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56943225/

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