1

私のアプリケーションは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});

私はおそらくに変更epochしますがt。そして、あなたがそのような単純な構造を持っていることを考えると、そうではありません:

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

メンバーをインデックスで参照します。コンストラクターの利点は継承されたメソッドですが、継承のレベルが 1 つしかない場合は、単純な関数が効果的であり、おそらく実行がより高速です (グローバル オブジェクトのルックアップは通常、[[Prototype]]チェーンに比べて非常に高速ですが、以下の警告を参照してください)。

ちなみに、エポックという名前は間違った文脈で使われていると思います。エポックは基準点であるため、たとえば 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 に答える