2017-01-08 9 views
3

私は10個の要素のアレイとブール変数の16個の* 16 * 256箱でチャンクを作成する簡単なコードを、持っています。メソッドtickは配列要素を増やし、チャンク内の各ボックスのブール値を100回変更します。は、Google Chromeのよりもはるかに遅いのですか?

のWindows x64のは7.4.0のNode.js:
1目盛り:102.85
合計時間(100):10285

Google Chromeを、私は結果を持っている時間を測定することにより


1ティック:18.08
合計時間(100):1808

同じマシン上で55 0

さえ、根本的なスニペットが速くノードよりも桁違いです。
スニペット:
1目盛り:22.79
合計時間(100):2279

だから、どのように私は、ノードが高速に動作することができますか?アレイのプレ充填

(function(){ 
 
\t class Box { 
 
\t \t constructor() { 
 
\t \t \t this.data = new Array(10); 
 
\t \t \t this.state = false; 
 
\t \t } 
 

 
\t \t tick() { 
 
\t \t \t this.state = !this.state; 
 
\t \t \t for(let i = 0; i < this.data.length; i++) { 
 
\t \t \t \t this.data[i]++; 
 
\t \t \t } 
 
\t \t } 
 
\t } 
 

 
\t class Chunk { 
 
\t \t constructor() { 
 
\t \t \t this.data = new Array(256); 
 

 
\t \t \t for(let z = 0; z < this.data.length; z++) { 
 
\t \t \t \t this.data[z] = new Array(16); 
 

 
\t \t \t \t for(let x = 0; x < this.data[z].length; x++) { 
 
\t \t \t \t \t this.data[z][x] = new Array(16); 
 

 
\t \t \t \t \t for(let y = 0; y < this.data[z][x].length; y++) { 
 
\t \t \t \t \t \t this.data[z][x][y] = new Box(); 
 
\t \t \t \t \t } 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t } 
 

 
\t \t tick() { 
 
\t \t \t for(let z = 0; z < this.data.length; z++) { 
 
\t \t \t \t for(let x = 0; x < this.data[z].length; x++) { 
 
\t \t \t \t \t for(let y = 0; y < this.data[z][x].length; y++) { 
 
\t \t \t \t \t \t this.data[z][x][y].tick(); 
 
\t \t \t \t \t } 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t } 
 
\t } 
 

 

 

 
\t var c = new Chunk(); 
 
\t var count = 100; 
 
\t var start = new Date().getTime(); 
 

 
\t for(let i = 0; i < count; i++) { 
 
\t \t c.tick(); 
 
\t } 
 

 
\t var end = new Date().getTime(); 
 

 
\t console.log("1 tick: " + (end - start)/count); 
 
\t console.log("Total time(" + count + "): " + (end - start)); 
 
})();

+1

Chromeは通常、リリースごとに頻繁にV8を更新します。どのバージョンのノードですか?ポスト – dandavis

+0

追加版もChromeをスピードアップしますが、彼らは今、ほぼ等しいです!ミックスタイプの配列(ヌルと数値)をアンボックスするのはなぜノードでもっと痛いのですか? – jDek

答えて

3

ノード

における強度改善の順序を与え、私が与えることができる唯一の説明」は空の配列スロットの「変換」することですあなたの元のコードで長さ1から0までの配列を単純に "充填"するだけで、同様のスピードアップが得られます。

主なスピードアップは、プレfクラスボックス内のthis.dataの病気(empty配列項目のthis.data[i]++は655360回使用されているので、それはおそらくです)さておき、あなたのチャンクのコンストラクタは

に「簡略化」することができよう

(function(){ 
    class Box { 
     constructor() { 
      this.data = new Array(10).fill(0); 
      this.state = false; 
     } 

     tick() { 
      this.state = !this.state; 
      for(let i = 0; i < this.data.length; i++) { 
       this.data[i]++; 
      } 
     } 
    } 

    class Chunk { 
     constructor() { 
      this.data = new Array(256).fill(null); 

      for(let z = 0; z < this.data.length; z++) { 
       this.data[z] = new Array(16).fill(null); 

       for(let x = 0; x < this.data[z].length; x++) { 
        this.data[z][x] = new Array(16).fill(null); 

        for(let y = 0; y < this.data[z][x].length; y++) { 
         this.data[z][x][y] = new Box(); 
        } 
       } 
      } 
     } 

     tick() { 
      for(let z = 0; z < this.data.length; z++) { 
       for(let x = 0; x < this.data[z].length; x++) { 
        for(let y = 0; y < this.data[z][x].length; y++) { 
         this.data[z][x][y].tick(); 
        } 
       } 
      } 
     } 
    } 





    var c = new Chunk(); 
    var count = 100; 
    var start = new Date().getTime(); 

    for(let i = 0; i < count; i++) { 
     c.tick(); 
    } 

    var end = new Date().getTime(); 

    console.log("1 tick: " + (end - start)/count); 
    console.log("Total time(" + count + "): " + (end - start)); 
})(); 

this.data = new Array(256).fill([]).map(item => new Array(16).fill([]).map(item => new Array(16).fill([]).map(item => new Box()))); 

しかし、これは任意のさらなる改善

私も.forEachおよび/またはを使用してみましたがありません。- ただし、そのような変更は実際にノードのダニを約10%遅くしました。

+0

から – dandavis

+0

うわー!約25倍速く動作します!それを高速化できるクラスと配列を作成する別の方法がありますか? – jDek

+0

私はあなたに25倍のスピードの改善を与えました(奇妙なことに私のシステムでは約10倍ですが、私の「ダニ」は6.4程度です)。 :p –

関連する問題