【发布时间】:2019-07-10 02:10:45
【问题描述】:
我已阅读有关 packed arrays in the V8 engine 的信息,并希望在我的游戏的某些性能关键部分(例如作为粒子的容器)中使用它们。
我想创建一个始终保持 PACKED 的 Array 的自定义子类,但似乎无法用另一个数组扩展 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() 慢,并且对于大型数组失败。
【问题讨论】:
-
你想要推入的预期阵列的大小是多少?我删除了我的答案,因为我没有阅读你的最后一句话^_^。您能否提供一个测试场景,以便我们有一些工作要做?
-
@Icepickle 从几十到几千个元素。
-
@Icepickle 有很多场景,一些例子:用于自定义信号实现的事件接收器列表、游戏内实体列表、可渲染精灵列表等。在游戏中,每个数组应该是尽可能快,因为它们每秒被访问和迭代数千次。
-
@Icepickle 所以我需要一个通用容器,它可以分块分配内存(扩展自身),并且可以在尽可能多的场景中使用。
-
我是您链接到的 V8 文章的作者。创建
PackedArray子类会将V8 实现细节与您的代码混合在一起,恕我直言,应该避免这种情况。一般来说,专注于编写可读的、惯用的代码。如果您想避免数组中出现漏洞,则无需为其创建子类——只需使用您已经提到的技术即可。请注意,即使HOLEY元素种类也可以优化,因此根据您的用例,性能差异可能不是什么大问题。您是否衡量过HOLEY与PACKED对您的代码的影响?
标签: javascript inheritance optimization v8