【发布时间】:2018-09-16 00:45:09
【问题描述】:
我正在开发一款游戏,因此必须同时考虑性能提升小和大。
我正在阅读 V8 中的数组初始化,特别是 this article,这表明对于小型数组,使用 var myArray = new Array(100) 格式最终比 var myArray = [] 更快(作者建议将小于 ~1000 个元素作为小型数组的阈值)。
鉴于一些假设,不难看出原因。特别是,如果优化后数组的元素都是相同类型的,比如说,所有整数,它们应该被预先分配在连续的内存中,并且不会导致 V8 改变它对数组as described here 的内部表示。当元素在别处使用时,这也将允许编译器对形状做出假设。
然而,在我的情况下,我需要一个对象引用数组,并且我能够按顺序对它们进行初始化。所以,继续我们从上面所知道的,我想出了这个:
class A {
constructor() {
this.particles = new Array(60);
for (var i = 0; i < particles.length; ++i) {
this.particles[i] = new Particle();
}
}
}
class Particle {
//...
}
正如第一篇文章所述,这是他处理数字类型的最快方法。因此,我假设 V8 假定每个数组的一种本机数字类型的大小并为其分配空间。但是,我不确定是哪个。我也不确定对象引用的大小与分配每个元素的本机类型的大小相比如何。
一个较小的问题是,如果默认元素大小分配大于它需要的一个数组,该数组只包含对一个对象的引用(所有相同类型,并且所有假定在内存中都是连续的),是使用这种数组初始化策略每个元素浪费的空间?有没有办法避免这种情况?如果是这样,是否可以保留访问速度的优化?
优化每个Particle的访问速度,上面的初始化可以改进吗?
【问题讨论】:
标签: javascript arrays optimization ecmascript-6 v8