【译】 Node.js v0.12的新特性 -- 性能优化
原文: https://strongloop.com/strongblog/performance-node-js-v-0-12-whats-new/
January 21, 2014/in Community, Node.js v0.12, StrongNode /by Ben Noordhuis
本文地址:http://www.cnblogs.com/jasonxuli/p/4536695.html
Node.js v0.12版本如此长的研发周期(9个月并且还在继续,目前为止最长的)使得核心团队和贡献者有足够的机会来介绍一些性能优化。本篇博客的目的是覆盖多数的主要的点。
writable stream支持cork模式:
writable stream 现在支持“corked”模式,类似TCP_CORK 和 TCP_NOPUSH 的socket选项。
当处于corked模式时,写入stream的数据被加入队列直到该stream被uncorked。这样Node.js会合并小的写入数据,从而减少系统调用和TCP往返。
http模块已经升级,会在发送chunked模式的请求或回复时透明的使用corked模式。如果你使用strace查看输出,你会注意到系统调用里writev多了,write少了。
TLS性能改进:
tls模块在v0.12有了很多修改。
在v0.10里,tls模块位于net模块的上层,透明的加解密网络流数据。这种层的方式是工程师喜欢的,但导致了一些成本 -- 严格来说不必要的内存移动和V8 VM内外调用 -- 因此需要优化。
这就是为什么v0.12版本中tls模块直接使用了libuv。现在它直接接收网络流数据并解密而不需要经过中间层。
使用空秘钥的不严格的测试显示,tls比之前快了10%,同事消耗的内存也少了。(我应该说明的是,内存的减少也许部分是因为内存管理的改进。这是v0.12的另一项优化。)
(另外,如果你想知道,那么空秘钥是不会加密目标数据的秘钥,用来衡量底层和协议的成本)。
tls模块的多数改变对于终端用户应该是透明的。最显眼的一个是tls连接现在继承于tls.TLSSocket,而不是tls.CryptoStream。
Crypto的性能改进:
有几个密码算法应该比之前更快了,有时候相当快。下面是一些信息:
Node.js的密码系统使用的是OpenSSL库。OpenSSL中的算法的一些引用的实现是由C写的;也有一些为了特殊平台和架构的汇编。
v0.10版本已经使用了汇编并且做了很多扩展。另外,在CPU支持的情况下会使用AES-NI。最近三四年的多数x86 CPU都支持。
Linux系统中,如果 grep ^flags /proc/cpuinfo | grep -w aes 这个命令发现任何匹配结果,那么你的系统就支持AES-NI。注意,类似VMWare或VirtualBox的软件可能会隐藏CPU的某些能力,包含AES-NI。
开启AES-NI的预计结果是,AES128-GCM-SHA256之类的工业强度的密码现在会快于非加密的密码,例如NULL-MD5!
减少垃圾收集的张力:
多上下文重构(multi-context refactoring)的一部分效果就是,它减少了Node.js 核心里的persistent handle。
Persistent handle是指向V8堆内对象的强引用,直到引用被删除的时候才会被GC回收。(GC认为它是artificial GC root)
Node.js的persistent handle用于缓存经常使用的值,例如字符串和对象原型。然而,persistent handle需要GC做特别的后处理,因此会导致随着handle数量而线性增加的成本。
作为多上线文清理工作的一部分,相当多的persistent handle已经被去掉,或者被切换到更轻量的机制(称作’永久句柄‘ eternal handles)
实际结果是,你的程序在GC上用的时间少了,真正干活的时间多了。现在,--prof输出中,v8::internal::GlobalHandles::PostGarbageCollectionProcessing() 应该更少的显示信息。
更好的集群性能:
见上篇。
更快的timer,更快的setImmediate(0,更快的process.nextTick():
setTimeout()及相关函数现在使用了一个更快也更少时钟偏移的时间来源。这项优化所有平台都可用,但是早Linux平台上更进一步的从VDSO读取当前时间,因此极大的减少了gettimeofday和clock_gettime这两个系统调用的数量。
setImmediate()和process.nextTick()也有性能调整:在一般情况下的分发添加了快速路径。上述函数已经挺快了,但现在更快。
【译】 Node.js v0.12的新特性 -- 性能优化的更多相关文章
- 【译】 Node.js v0.12的新特性 -- Cluster模式采用Round-Robin负载均衡
原文:https://strongloop.com/strongblog/whats-new-in-node-js-v0-12-cluster-round-robin-load-balancing 本 ...
- Node.js V0.12 新特性之性能优化
v0.12悠长的开发周期(已经过去九个月了,并且还在继续,是有史以来最长的一次)让核心团队和贡献者们有充分的机会对性能做一些优化. 本文会介绍其中最值得注意的几个. http://www.infoq. ...
- Node.js V0.12新特性之性能优化
v0.12悠长的开发周期(已经过去九个月了,并且还在继续,是有史以来最长的一次)让核心团队和贡献者们有充分的机会对性能做一些优化.本文会介绍其中最值得注意的几个. 支持塞住模式的可写流 现在可写流可以 ...
- Atitit js版本es5 es6新特性
Atitit js版本es5 es6新特性 Es5( es5 其实就是adobe action script的标准化)1 es6新特性1 Es5( es5 其实就是adobe action scrip ...
- Node.js v0.10.31API手冊-控制台
Node.js v0.10.31API手冊-文件夹 控制台 Object 用于向 stdout 和 stderr 打印字符.类似于大部分 Web 浏览器提供的 console 对象函数,在这里则是输出 ...
- Node.js v0.10.31API手冊-事件
Node.js v0.10.31API手冊-文件夹 Events(事件) Node里面的很多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStrea ...
- 介绍Ext JS 4.2的新特性的《深入浅出Ext JS》上市
以用户为中心的时代,应用的界面外观变得越来越重要.然而,很多程序员都缺乏美术功底,要开发出界面美观的应用实属不易.Ext JS的出现,为广大程序员解决了这一难题.它有丰富多彩的界面和强大的功能,是开发 ...
- atitit.js 各版本 and 新特性跟浏览器支持报告
atitit.js 各版本 and 新特性跟浏览器支持报告 一个完整的JavaScript实现是由以下3个不同部分组成的 •核心(ECMAScript)--JavaScript的核心ECMAScrip ...
- Node.js v0.10.31API手工-DNS
原版的API品种,这是从以前的翻译和翻译风格不同 Node.js v0.10.31API手冊-文件夹 DNS 使用 require('dns') 引入此模块. dns 模块中的全部方法都使用了 C-A ...
随机推荐
- 理解 __declspec(dllexport)和__declspec(dllimport)
1.解决的问题: 考虑下面的需求,使用一个方法,一个是提供者,一个是使用者,二者之间的接口是头文件.头文件中声明了方法,在提供者那里方法应该被声明为__declspec(dllexport),在使用者 ...
- SAP BW顾问如何保持市场竞争力
跟大部分电工一样,SAP顾问也经常有迷茫的时候.因为,这个世界变化实在太快了.每一个电工,总是在担心自己会不会被飞速发展的技术所淘汰.那么,作为 一个BW顾问,应该如何保持市场竞争力呢?我觉得需要两个 ...
- 【PAT Advanced Level】1008. Elevator (20)
没什么难的,简单模拟题 #include <iostream> using namespace std; int main() { int num; cin>>num; int ...
- PHP实现Web Service(转)
1.OAuth OAUTH协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码) 2.SCA 服务组件 ...
- 信号之sleep函数
#include <unistd.h> unsigned int sleep(unsigned int seconds); 返回值:0或未休眠够的秒数 此函数使调用进程被挂起,直到满足以下 ...
- dsp与sem的互补以及技术实现
SEM翻译过来叫搜索引擎营销,个人认为是随着搜索引擎竞价排名出现的一个行业,已经有了好多年的历史,做sem的公司这些年里手里应该都积攒着大量的cookie,关键词等与SEM和追踪相关的数据,这些数据现 ...
- BootStrap2学习日记4---常用标签与样式
<small>:常常和h1标签一起搭配使用 如<h1>标题<small>小标题</small></h1> <abbr>:abbr ...
- ResponseBody的使用
使用Spring的@ResponseBody有时还是挺方便的,在ajax调用返回纯字符串时有中文编码问题. @ResponseBody @RequestMapping(value="/dec ...
- CentOS(四)--Linux系统的启动级别
对于绝大多数Linux程序员来说,进入Linux系统后一般看到的是黑乎乎的界面(开发模式),因为系统如果启动选择开发模式,会减少启动时间,优化内存等.但是通常我们刚安装完Linux系统,然后进去以后是 ...
- Linux系统上安装软件(JDK以及tomcat服务器)
一:安装jdk linux系统上面如果运行java程序,就需要安装java的运行环境(jdk) 1:下载linux版本的jdk 地址:http://www.oracle.com/technetwork ...