0

教えてください、値を配列にプッシュするより速い方法は何ですか?

メソッドpushと比較する簡単なテストを作成しました。a[a.length]=

push.js:

self.onmessage = function (event) {
  var n = Number(event.data),
      i,
      pushAr = [],
      pushStart,
      pushDuration,
      ar = [],
      start,
      duration,
      message;

  // Push
  pushStart = new Date();
  for (i = 0; i < n; i += 1) {
    pushAr.push(i);
  }
  pushDuration = new Date() - pushStart;

  // explicit
  start = new Date();
  for (i = 0; i < n; i += 1) {
    ar[ar.length] = i;
  }
  duration = new Date() - start;

  message = "N = " + n;
  message += "\nPush duration: " + pushDuration + "; ";
  message += "Length duration: " + duration;

  self.postMessage(message);
};

main.js:

var worker = new Worker("push.js"),
    i;

worker.onmessage = function (event) {
  console.log(event.data);
};

for (i = 4; i < 8; i += 1) {
  worker.postMessage(Math.pow(10, i));
}

そして、私は次の結果を得ました:

クロム:

N = 10000
Push duration: 0; Length duration: 0
N = 100000
Push duration: 3; Length duration: 5
N = 1000000
Push duration: 56; Length duration: 90
N = 10000000
Push duration: 807; Length duration: 948

サファリ:

N = 10000
Push duration: 1; Length duration: 4
N = 100000
Push duration: 2; Length duration: 2
N = 1000000
Push duration: 27; Length duration: 41
N = 10000000
Push duration: 283; Length duration: 461

ファイアフォックス:

N = 10000
Push duration: 1; Length duration: 0
N = 100000
Push duration: 2; Length duration: 2
N = 1000000
Push duration: 11; Length duration: 20
N = 10000000
Push duration: 279; Length duration: 412

より速いようArray.pushに思えますが、なぜ一部のライブラリがarray length代わりに使用するのですか? そして、そのような方法のどのようなボーナスがありますか? Chrome が遅いのはなぜですか? 多分いくつかのより速い方法が存在しますか?

4

2 に答える 2

2

どちらの方法もまったく同じです。同じアルゴリズム(配列の長さを取得する)がスクリプトではなくスクリプトエンジン内で機能するため、プッシュが高速になります。連鎖割り当てのように、その式の結果を新しい値にする必要がある場合は、ar[ar.length]を使用できます。somevar = ar[ar.length] = "some new value"

私は他のいくつかの可能な使用法を見つけました-古いバージョンのjavascriptエンジンとの互換性。JScriptバージョン5.0のMicrosoftドキュメントには、Arrayオブジェクトのpushメソッドについての言及はありません。そして、実際にコードを使用している自分のコードを当時(2000年頃)から見つけましたimages[images.length] = s。したがって、配列に常にpushメソッドがあるとは限りませんでした。

PSはい、pushメソッドのMSDN cocumentationは、バージョン5.5が必要であり、Windows2000でもそうではなかったと述べています。

于 2012-06-06T08:52:26.483 に答える
1

一部のライブラリ (jQuery など) は、実際のar[ar.length]配列を使用しないために を使用しますが、配列ではなくオブジェクトであるためメソッドを持たない ArrayObjects を使用します。その問題を解決するために使用され、頻繁に遭遇する可能性のある別のトリックは次のとおりです。.push

Array.prototype.push.call(arrObj,'newValue');

使用するもう 1 つの理由ar[ar.length]は、Panda-34 で言及されています: 連鎖割り当て..!

于 2012-06-06T09:00:21.000 に答える