有没有比javascript中的对象数组更有效的方法来存储大量数据?

时间:2012-04-19 02:39:26

标签: javascript

我的应用程序每秒收集10次加速,因此我需要存储数千行数据。目前我有一个对象,它是一个存储它的所有其他对象的列表 - 比这更有效吗?

var arr = [];

function dataPoint(x, y, z, tstamp) {
    this.xAccel = x;
    this.yAccel = y;
    this.zAccel = z;
    this.epoch = tstamp;
}

var dp = new dataPoint( acceleration.x, acceleration.y, acceleration.z, acceleration.timestamp );

arr.push(dp);

2 个答案:

答案 0 :(得分:0)

如果您定位的平台支持typed arrays,那么这些可能会更有效。

答案 1 :(得分:-1)

查看您的代码:

> var arr = [];  
> function dataPoint(x, y, z, tstamp) {
>     this.xAccel = x;
>     this.yAccel = y;
>     this.zAccel = z;
>     this.epoch = tstamp;
> }
> var dp = new dataPoint( acceleration.x, acceleration.y,
>          acceleration.z, acceleration.timestamp );
> arr.push(dp); 

我不明白你为什么要打扰构造函数,你可以简单地做(缩写):

  arr.push({x: acc.x, y: acc.y, z: acc.z, epoch: acc.timestamp});

虽然我可能会将epoch更改为t。鉴于你有简单的结构,为什么不:

  arr.push([acc.x, acc.y, acc.z, acc.timestamp]);

并按索引引用成员。构造函数的优点是继承的方法,但是如果你只有一个级别的继承,简单的函数只是一个有效的,可能更快的执行(与[[Prototype]]链相比,对全局对象的查找通常非常快,但是见下面的警告)

顺便说一句,我认为名称​​ epoch 正在错误的上下文中使用。一个纪元是一个参考点,所以你可能有一个说明2012-04-20T18:53:21.098Z的纪元,然后以毫秒或秒为单位从中获得增量。 javascript时间引用的时期(即Date.prototype.getTime返回的值)是1970-01-01T00:00:00Z,时间参考是一个增量。

买者

关于什么是“最佳”,我认为你的标准是“最快的”,但需要注意的是代码必须仍然合理清晰和可维护。您最好的选择是避免明显的速度问题,然后在各种浏览器中进行测试并根据结果进行优化。一个浏览器中的优化在其他浏览器中可能几乎没有差异,或者可能明显较慢。例如在大多数浏览器中,递减循环曾经更快,但在Opera中速度要慢得多。另外,在循环条件中评估表达式,例如:

  while ((el = node.firstChild))

曾经慢得多:

  while (el) {
    el = node.firstChild

但是对于较新的浏览器来说似乎并不重要。类似地,for循环与while循环一样快(通常)。但需要更多的打字来设置。