1

我的应用程序每秒收集 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);
4

2 回答 2

0

如果您的目标平台支持类型化数组,那么这些可能会更有效。

于 2012-04-19T02:49:54.713 回答
-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});

虽然我可能会更改epocht. 鉴于你有这样简单的结构,为什么不:

  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 和 do 循环一样快(通常)。但需要更多的输入来设置。

于 2012-04-19T05:29:21.033 回答