from:http://faylai.iteye.com/blog/1293194javascript
一、避免使用同步的方法css
nodejs 是基于单线程。为了让单线程可以处理高并发的请求,咱们尽可能要避免让线程等待,阻塞,同步,和长时间运行某项操做。nodejs 一个显著的特色就是彻头彻尾的异步。这个特性在基于事件驱动的应用上表现的很是的出色。html
不幸的是在nodejs 中仍然存在能够同步或者阻塞调用方法。例如,许多的文件系统操做既有异步的方法也有同步的方法,像 fs.writeFile 和 fs.writeFileSync。尽管你避免在代码中使用同步的方法,但你引用的外部库中可能包含导致阻塞的方法调用。一旦这种状况出现,将会对性能产生显著的影响。java
// 正确写法: 异步的写文件
fs
.
writeFile
(
'message.txt'
,
'Hello Node'
,
function
(
err
)
{
console
.
log
(
"It's saved and the server remains responsive!"
);
});
// 音响性能的写法: 同步的写文件
fs
.
writeFileSync
(
'message.txt'
,
'Hello Node'
);
console
.
log
(
"It's saved, but you just blocked ALL requests!"
);
二、关闭 socket 链接池
nodejs http client 自动使用socket 链接池,默认状况下每一个主机将socket per 限制到五个。当socket 被回收重用后资源的增加将会没法控制,特别是你要处理从同一主机发送大量并发请求数据时候将会致使严重的性能瓶颈。这种状况下,最好的解决办法是增长 maxSockets 或者禁用 socket 链接池:node
var
http
=
require
(
'http'
);
var
options
=
{.....};
options
.
agent
=
false
;
var
req
=
http
.
request
(
options
)
三、不要用nodejs 来管理静态资源
静态资源像css文化和图片文件,可使用其余的web服务器来管理,好比 nginx ,或者你把你的文件上传到CDNs.
这样作有两个好处:(1)减小nodejs 的负载(2)CDNs可选择最近的服务器然投递静态内容减小了传输延迟。
四、渲染放到客户端
让咱们快速比较下页面在服务端渲染和客户端渲染区别。若是咱们用nodejs 渲染,每次请求咱们返回的html以下:
<html>
<head>
<title>LinkedIn Mobile
</title>
</head>
<body>
<div
class=
"header"
>
<img
src=
"http://mobile-cdn.linkedin.com/images/linkedin.png"
alt=
"LinkedIn"
/>
</div>
<div
class=
"body"
>
Hello John!
</div>
</body>
</html>
显然的除了用户的名字是动态,其余都是静态。也就是说相同东西每次都要加载一遍。更有效的方法就是直接让
nodejs 返回动态的json数据:
{"name": "John"}
剩下的静态标签可使用javascript 模版引擎
<html>
<head>
<title>LinkedIn Mobile
</title>
</head>
<body>
<div
class=
"header"
>
<img
src=
"http://mobile-cdn.linkedin.com/images/linkedin.png"
alt=
"LinkedIn"
/>
</div>
<div
class=
"body"
>
Hello
<%= name %>!
</div>
</body>
</html>
静态javascript 模版能够用nginx 代理,其实若是放到CDN就更好了。
另外你能够在模版第一次时保存到浏览器缓存中或者存放到 本地存储中。以后页面初始化完毕,
就剩下动态的json数据 的交互。大大减少了cpu 时间和io 负载。
五、开启gzip
愈来愈多的web服务器和客户端支持gzip 压缩。
这个好处真的不要放过哦,不论是响应客户端或者请求服务均可以采用。
六、使用并行
试着把请求远程服务,数据库调用,文件系统访问这些操做并行起来运行。若是按照线性的步骤来运行这些费时
的操做延迟总量等于每一个操做延时总和。推荐使用
Step 来管理你的callback 流程。
七、尽可能不要使用session
app
.
use
(
express
.
session
({
secret
:
"keyboard cat"
}));
默认状况下,seesion 是存储在内存中的,这个会增长服务器的额外开销,特别用户量增长时候。
你能够把session 存储到数据库,例如MongoDB 或者Redis ,
可是每一个请求的都会从数据库查询session 信息这样也增长了额外的性能开销。
若是能够,最好的选择不要在服务端存储状态信息。express 中没这样的配置,可是性能提高是显然。
八、使用二进制模块
若是能够,使二进制模块来取代javascript 的模块,
例如当咱们从用javascript 写SHA 的模块切换到编译成二进制模块时,咱们发现很大性能提高空间。
// 使用本地内置的二进制模块
var
crypto
=
require
(
'crypto'
);
var
hash
=
crypto
.
createHmac
(
"sha1"
,
key
).
update
(
signatureBase
).
digest
(
"base64"
);
九、使用标准v8 javascript 而不是客户端库
许多的javacript 库专门用于web浏览器,
这些浏览器的javascript 引擎不一致:有些浏览器支持某些方法像 forEach,map 和reduce,
可是其余的浏览器没有这些方法。
结果致使,客户端库含有许多有损性能的代码来保证方法的兼容。
十、 保持代码简洁
保持的你的代码的清洁不论是客户端或者服务端。不断的审视本身:"咱们真须要这个模块吗?","为何须要这个框架","性能的消耗值得吗?","是否有更简单的方法?"。简洁的代码每每更加的高效。