WebWeb前端之路程序员

Nodejs代码规范和API性能优化方案

2017-03-17  本文已影响213人  e042cbe4da21

1、增加eslint规范

在团队协作中,为避免低级 Bug、产出风格统一的代码,会预先制定编码规范。使用 Lint 工具和代码风格检测工具,则可以辅助编码规范执行,有效控制代码质量。

使用eslint不仅仅可以统一代码规范,它的很多规则同时考虑了javascript语言的隐藏缺点以及一些被广泛认同的性能规范,因此使用eslint也可以同时提升代码的性能。
可参考使用npm包eslint-config-fornode

2、避免使用同步代码

Node.js的一个显著特征是:它从上到下的设计和实现都是为了实现异步,一个同步调用可能将导致性能从每秒上千次的请求降至只有几十个。

不幸的是,我们代码总会有发生同步/阻塞的调用。

3、统一异步编程风格

代码中实现异步编程的代码包含了promise、callback、generator、async/await三种风格,为了增加代码的可读性统一进行封装使用,例如使用generator和yield风格进行异步编程,或者使用async/await。

4、代码保持小且轻

缩减不必须需要的模块,直接用标准的V8 JavaScript函数替代实现,性能会得到显著的提高。
用更简单更高效的方法实现相同的功能。(说起来容易做起来最难的一步)

5、定义局部变量

JavaScript引擎在作用域链中搜索的深度越大,那么操作也就会消耗更多的时间。引擎首先从 this 开始查找局部变量,然后是函数参数、本地定义的变量,最后遍历所有的全局变量。

因为局部变量在这条链的起端,所以查找局部变量总是比查找全局变量要块。所以当你想要不止一次地使用一个全局变量的时候,你应该将它定义成局部变量。

(es6最小作用域为块级)

6、优化循环

根据循环逻辑判断使用倒循环还是正循环,而不是一味的使用正循环。
考虑使用do...while(后测试循环)、while(前测试循环)、map、reduce、filter等代替for循环。(map、reduce、filter可实现函数式编程,链式代码更加易读)
简化终止条件,使用continue,break控制减少循环开销。
当循环次数是确定的,消除循环并使用多次函数调用往往会更快。
避免双重或更多重循环。

7、避免 for-in 循环(和基于函数的迭代)

这背后的逻辑非常直接:要遍历一个集合内的元素,你可以使用诸如for循环、或者do-while循环来替代for-in循环,for-in循环可能需要遍历额外的数组项(会遍历原型链)。

8、使用switch和三目运算符代替if

将条件分支,按可能性顺序从高到低排列:可以减少解释器对条件的探测次数

9、精简变量声明

同一种数值声明,同类别数据声明应该用一条语句声明,不同变量用“,”隔开,增加代码的可读性并且将变量代码分类,减少出错概率。

10、数组虑重

双重循环,时间复杂度为O(n2)。

排序后遍历,这种方法的时间复杂度为O(n),但是还要考虑排序的消耗。

Hash的方法方法时间复杂度为O(n),是应用最为广泛的去重方法。

11、数组、对象深拷贝实现和优化

数组深拷贝
var a = [1,2,3,4,5];

var b = Array.from(a);//方法1 ES6

var b = a.slice(0);//方法2

var b = a.concat([]);//方法3

var b = JSON.parse(JSON.stringify(array));//方法4

注意1:方法1、2、3只适合数组成员为非引用类型的情况,如果数组成员为引用类型,这些方法拷贝的引用类型成员依然为浅拷贝

注意2:方法4可以完美深拷贝数组,但该方法也并不是没有缺点,在此不详细描述。

对象深拷贝 使用Object.create实现 Object.create实现:
if (!Object.create) {

Object.create = function (o) {

function F() {}  //定义了一个隐式的构造函数

F.prototype = o;

return new F();  //其实还是通过new来实现的

};

}

上一篇 下一篇

猜你喜欢

热点阅读