【译】 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 ...
随机推荐
- 关于GridBagLayout的讲解哦
13-08-29 17:01:10| 分类: Java | 标签:gridbaglayout gridbagconstraints 添加方法 |字号 订阅 GridBagLayout ...
- Chrome Apps将可以打包成iOS或Android应用
Chrome Apps 将可以在 iOS 和 Android 设备上独立运行了.开发者只要使用 Google今天 提供的工具集(toolchain)将自己的 Web App 打包,并将生成的应用上传到 ...
- Javascript Design Patterns - Js Class
JavaScript is a class-less language, however classes can be simulated using functions. eg: // A car ...
- codeforces Gym 100500C D.Hall of Fame 排序
Hall of Fame Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100500/attachmen ...
- TC SRM 665 DIV2 B LuckyCycle 暴力
LuckyCycleTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.ac ...
- python selenium自动化(三)Chrome Webdriver的兼容
当一个自动化测试被实现在一个浏览器之后,我们会希望我们的测试能够覆盖到尽量多的别的浏览器.通过跨平台的测试来保证我们的程序在多个浏览器下都能正常工作. 在安装了selenium之后,firefox w ...
- as 中的反射
flash.utils包中的getDefinitionByName,getQualifiedClassName,getQualifiedSuperclassName..可以当做反射用. 1.getDe ...
- SQL SERVER中架构的理解
在sqlserver 2005中,可能大家在工作或学习的时候会经常发现这样一些问题,你使用一个账户在数据库中创建了一张表,却发现你自己创建的表却没有修改和查询的权限,这是一件很郁闷的事情,在sqlse ...
- Helpers\FastCache
Helpers\FastCache phpFastCache is a high-performance, distributed object caching system, generic in ...
- Asp.Net 之 服务器端控件与客户端控件的区别
服务器控件,即Asp.Net的控件,控制这些控件必须经过服务器处理,然后响应用户,代码在服务器端解释执行,生成根据用户的浏览器而定的html元素. 客户端控件,即普通Html控件,使用script控制 ...