记录nodejs中碰到的一些小的不起眼的性能问题
发布于 6 年前 作者 frosh 3686 次浏览 来自 分享

因为解决数独问题一直在考虑如何提升性能,提高解题速度 通过各种手段的优化,途中碰到一些js的性能问题,记录一下 然后还有一些目前自己仍然不理解的地方,也希望有朋友能给予解答

  1. Object.assign的性能比util._extend性能低
  2. console.log是个比较耗时的操作
  3. js在进行new 操作的时候耗时比较多,因为需要申请内存资源

新建的class对象,在第一次调用里面各种函数的时候速度都会慢,第二次实例化并且调用就快很多了

for(let map in maps) {
    let sdk = new Sudoku({
        display: false, // 是否打印过程,打印的速度慢很多
        sudokuMap: maps[map],
    }).start();
}
```js
上面的代码中如果运行到hard1这个数独的时候,在这种循环内所需要时间会比下面的写法少很多
并且第一次循环的第一个数独,解答时间和单独去解答这个数独所需时间是一致的
```js
let sdk = new Sudoku({
    display: false, // 是否打印过程,打印的速度慢很多
    sudokuMap: maps['hard1'],
}).start();

这一块需要参考上一篇文章中的数独解法的代码部分

这让我联想到eggjs里面的所有controller,service都会预先实例化 不知道跟这个是否有关系,有大神知道的希望告知下

4 回复

新建的class对象,在第一次调用里面各种函数的时候速度都会慢,第二次实例化并且调用就快很多了

这个跟V8的原理 “隐藏类” 和 “内联缓存”相关 因为js没有严格的类区分,而C++有,所以你每次新增或删除属性的时候它都会建立一个新类作为类的缓存 等你下次使用相同属性类的对象的时候,会从那个缓存里面读取,所以第二次会快很多

我看到很多库都是用 Object.assign

util._extend 已经被废弃了

util._extend虽然已经废弃,但是性能比Object.assign貌似高2到3倍 node内部代码还是在使用util._extend 可能就是因为性能问题吧

回到顶部