我有简单的代码,创建了一个包含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;
答案 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%