【译】 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 ...
随机推荐
- Codeforces Round #333 (Div. 2) C. The Two Routes flyod
C. The Two Routes Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/602/pro ...
- PHP实现Web Service(转)
1.OAuth OAUTH协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码) 2.SCA 服务组件 ...
- 僵尸进程 图解 分布式 LINUX内核
http://blog.csdn.net/chdhust/article/details/11872467 服务器进程为何通常fork()两次
- 进程环境之getrlimit和setrlimit函数
每个进程都有一组资源限制,其中一些可以用getrlimit和setrlimit函数查询和更改. #include <sys/resource.h> int getrlimit( int r ...
- CISCO 双线接入MAP配置详解
随着我国宽带技术的普及,各个公司都会有一至二条Internet接入线路,这些线路可能由电信.网通.长宽.联通等不同的IS提供,尽管他们在局端采用的技术可能有不同,但对客户而言都是同样接入方式,以太 ...
- Oracle11g for RedHat6.4安装手册
一. 检查 Oracle 11g 安装所依赖的软件包 检查包是否安装 # rpm -q 包名 包名: 1 ) binutils 2 ) compat-libstdc++ 3) elfutils ...
- Fedora下载地址
http://fedoraproject.org/zh_CN/get-fedora-all
- 琐碎-hadoop2.2.0伪分布式和完全分布式安装(centos6.4)
环境是centos6.4-32,hadoop2.2.0 伪分布式文档:http://pan.baidu.com/s/1kTrAcWB 完全分布式文档:http://pan.baidu.com/s/1s ...
- Peter's Hobby
Problem Description Recently, Peter likes to measure the humidity of leaves. He recorded a leaf humi ...
- BeanDefinitionRegistry extends AliasRegistry
// 用该Registry注册一个新定义的bean,但是新的bean必须支持父的定义和子的定义void registerBeanDefinition(String beanName, BeanDefi ...