手机版

nodejs' 10性能优化技巧

时间:2021-09-14 来源:互联网 编辑:宝哥软件园 浏览:

以下是我们在使用Node.js时遵循的10条性能规则:

1.避免使用同步代码

在设计上,Node.js是单线程的。为了允许一个线程处理多个并发请求,您永远不能让该线程等待阻塞、同步或长时间运行的操作。Node.js的一个显著特点是,它是从上到下设计和实现的,以实现异步。这使得它非常适合基于事件的程序。

不幸的是,同步/阻塞的呼叫仍可能发生。例如,许多文件系统操作都有同步和异步版本,如写文件和写文件同步。即使您使用代码来控制同步方法,也可能会无意中使用阻止调用的外部函数库。当您这样做时,对性能的影响是巨大的。

//Good:写文件异步fs.writeFile('message.txt ',' Hello Node ',function (err) { console.log('已保存,服务器保持响应!');});//BAD:写文件synchroniously fs . writelefilesync(' message . txt ',' Hello Node ');“已经保存,但是您刚刚阻止了所有请求!' );我们的初始化日志无意中包含了一个将内容写入磁盘的同步调用。如果我们不做性能测试,很容易忽略这个问题。当developer box中的node.js实例被用作标准测试时,这个同步调用会将性能从每秒数千个请求降低到只有几十个。

2.关闭套接字池

Node.js的http客户端将自动使用套接字池:默认情况下,它将每个主机限制为只有5个套接字。尽管套接字的重用可能会控制资源的增加,但如果您需要处理来自同一主机的许多并发数据请求,这将导致一系列瓶颈。在这种情况下,最好增加maxSockets的值或关闭套接字池:

//禁用套接字池var http=require(' http ');var选项={ 0.};options.agent=falseVar req=http.request(选项)3。不要让静态资源使用节点

对于静态资源,如css和图片,使用标准的网络服务器而不是Node.js。例如,领英移动使用nginx。我们还使用内容交付网络,它可以将世界各地的静态数据复制到服务器上。有两个好处:(1)可以减轻我们node.js服务器的负载;(2)cdn可以让静态内容在靠近用户的服务器上传递,从而减少等待时间。

4.在客户端呈现

让我们快速比较一下服务器渲染和客户端渲染的区别。如果我们使用node.js在服务器端进行渲染,我们将为每个请求发回一个如下所示的HTML页面:

!-一个完全在服务器端呈现的简单网页示例-!DOCTYPE html html head title LinkedIn Mobile/title/head body div class=' header ' img src=' http :3358 Mobile-cdn . LinkedIn.com/images/LinkedIn . png ' alt=' LinkedIn '/div class=' body ' Hello John!/div/body/html请观察这个页面的所有内容,除了用户名,都是静态内容:每个用户和页面重载的内容都是一样的。所以让Node.js只以JSON的形式返回页面需要的动态内容更有效。

其余的{'name': 'John'}页面-所有静态HTML标记-可以放在JavaScript模板中(例如下划线. js模板):

!-一个可以在客户端呈现的JavaScript模板示例-!DOCTYPE html html head title LinkedIn Mobile/title/head body div class=' header ' img src=' http :3358 Mobile-cdn . LinkedIn.com/images/LinkedIn . png ' alt=' LinkedIn '/div class=' body ' Hello %=name %!/div /body/html性能的提升来自于这些地方:第三点提到,静态JavaScript模板可以通过webserver(比如nginx)在服务器端提供,也可以通过更好的CDN来实现。此外,JavaScript模板可以缓存在浏览器中,也可以存储在本地。在加载完所有的初始页面之后,唯一需要发送给客户端的数据就是JSON,这将是最有效的。这种方法可以大大降低中央处理器、输入输出和节点的负载

5.使用gzip

许多服务器和客户端支持gzip来压缩请求和响应。无论是回答客户端还是向远程服务器发送请求,都要确保充分利用它。

6.并行化

尝试并行化所有阻塞操作——将请求发送到远程服务、数据库调用和文件系统访问。这将减少最慢阻塞操作的延迟,而不是所有阻塞操作的延迟。为了保持回调和错误处理的干净,我们使用Step来控制流量。

7.会议自由化

LinkedIn Mobile使用Express框架来管理请求/响应周期。许多快速示例包括以下配置:

app . use(express . session({ secret : '键盘猫' });默认情况下,会话数据存储在内存中,这将增加服务器的巨大开销,尤其是随着用户数量的增加。您可以使用外部会话存储,如MongoDB或Redis,但是每个请求都会导致远程调用获取会话数据的开销。在可能的情况下,最好的选择是将所有无状态数据存储在服务器端。不包括上述快速配置,通过放开会话,您可以看到更好的性能。

8.使用二进制模块

如果可能,用二进制模块替换JavaScript模块。例如,当我们从用JavaScript编写的SHA模块切换到Node.js的编译版本时,我们将看到性能的巨大飞跃:

//使用内置或二进制模块var crypto=require(' crypto ');var hash=crypto . createhmac(' sha1 ',key)。更新(签名)。摘要(' base64 ');9.用标准的V8 JavaScript替换客户端库

许多JavaScript库是为在web浏览器中使用而创建的,因为JavaScript环境不同:例如,有些浏览器支持forEach、map和reduce等功能,但有些浏览器不支持。因此,客户端库通常使用大量低效的代码来克服浏览器差异。另一方面,在Node.js中,可以确切知道哪些JavaScript方法是有效的:V8 JavaScript引擎支持Node.js实现ECMA-262第五版中指定的ECMAScript。如果直接用标准的V8 JavaScript函数替换客户端库,会发现性能明显提升。

10.保持你的代码小而轻

使用移动设备会使访问变慢,延迟变高,这告诉我们要保持代码的小而轻。服务器代码也遵循同样的原则。偶尔回顾一下自己的决定,问问自己这样的问题:“我们真的需要这个模块吗?”“我们为什么要使用这个框架?它的成本值得使用吗?”“我们能用简单的方法实现吗?”。萧晴和代码通常效率更高,速度更快。

尝试

我们努力让我们的移动应用变得更快。在IPhone、安卓和HTML5手机版上试试,让我们知道我们做得怎么样。

版权声明:nodejs' 10性能优化技巧是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。