21

Firefox (13.0.1) 内での JavaScript の奇妙な動作により、パフォーマンスの問題が発生しています。最新の Chrome は同じ動作を示します。

以下のコード スニペットのような JavaScript コードを実行すると、結果がかなり遅くなります。ただし、「j」を介して外側のループのコンテンツを単純にインライン化すると、約 10 倍のスピードアップが得られます。私のサンプル アプリケーションでは、'm' は 2 に等しいので、'j=0' と 'j=1' の固定値をそれぞれ 2 回書いているだけです。もちろん、'm は必要ありません。 ' ハードコーディングする必要があるため、実際のループを使用すると、この速度低下の正確な原因は何ですか?

誰かアイデアがありますか?

Web ワーカー内でコードを実行しています。奇妙なことに、ワーカーのコンテキストではなく、メインの JavaScript コンテキストで同じものを実行すると、インライン化のプラスの効果は発生しません。それにもかかわらず、'j' の 1 つの値に対してのみループ コンテンツを実行すると、すべてのケースで大幅な高速化に役立ちます。これもメモリ管理と関係がありますか?

よろしくお願いします!

//m: very small, 1-2
for (j = 0; j < m; ++j) {
  var attrib = attributes[j];

  //n: very large, ~3*10^6 elements
  for (i = 0; i < n; ++i) {

    var data = largeBuffer[i];

    //nc: very small, 2-3
    for (c = 0; c < nc; ++c) {
      var component;
      //compute 'component
      //..
      attrib.typedArray[baseIdx + c] |= component;
    }

    baseIdx += nc;
  }
}
4

1 に答える 1

4

これは単なる仮説です。JS通訳者の内部はよくわかりません。

おそらく、外側のループをインライン化すると、インタープリターは同じコードを4回認識し、JITをトリガーします。反対に、通常のループを使用する場合、コードはJITによって1回だけ表示されます。

繰り返しますが、これは単なる仮説です。

于 2012-07-16T18:45:02.253 に答える