为什么node.js比Google Chrome慢得多?

时间:2017-01-08 13:17:52

标签: javascript node.js performance google-chrome v8

我有简单的代码,创建了一个包含16 * 16 * 256个10元素数组和bool变量的块。方法tick增加数组元素并更改块中每个框的布尔值100次。

通过测量时间,我得到了结果:

Windows x64 node.js 7.4.0:
1刻度:102.85
总时间(100):10285

Google Chrome 55在同一台机器上:
1滴答:18.08
总时间(100):1808年

即使是底层片段也比节点快一个数量级 的段:
1滴答:22.79
总时间(100):2279

那么,我如何让Node更快地工作呢?



(function(){
	class Box {
		constructor() {
			this.data = new Array(10); 
			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);

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

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

					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));
})();
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:3)

预填充数组可以在节点中实现数量级的改进

我能给出的唯一解释是,在nodejs中将空数组槽“转换”为“已使用”的插槽更加昂贵 - 您可以通过简单地从长度为1“填充”数组来找到类似的速度原始代码中的0(不太多但接近)

主要加速是在类Box中预先填充this.data(但这可能是因为this.data[i]++数组项目上的empty被使用了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));
})();
  

另外,你的Chunk构造函数可以“简化”到

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

但这并没有进一步改善

我还尝试在适当情况下使用.forEach和/或.map - 但任何此类更改实际上都会使节点中的节拍减慢约10%