为什么v8引擎是什么这么快

从V8 JS引擎学到的优化经验 - WEB前端 - 伯乐在线
& 从V8 JS引擎学到的优化经验
V8是谷歌开源的一个高性能JavaScript引擎,用 C++ 实现,并用在谷歌的开源浏览器Chrome里。
为什么V8非常快,哪种方案让V8达到这种速度?发现其中秘密是一件有趣的事情。
面向对象、设计模式与性能
有些C/C++开发者有些奇怪的观念。他们认为使用面向对象和设计模式会降低程序的性能。但V8证明了这种观念是错误的。V8的实现使用了许多设计模式,但依然非常高效。
下面列出V8中使用的两个模式:
当Javascript引擎执行一个脚本时,引擎为遇到的每个变量、函数或数组都创建一个实例。JSObject是所有这些对象的父对象。
下面列出了所有继承自JSObject的类:
V8实现了一个工厂类来创建这些对象,该类中的Factory::NewJsObject就是用来创建这些对象的。
下面列出了所有使用该类/方法的方法。
V8引擎中的类并没有直接使用这个工厂类,而是添加了另一层封装,通过Heap类调用该工厂类。
访问者模式:
维基百科上这样解释观察者模式:
观察者设计模式是将算法和算法处理的对象分开的一种方式。这种分离可以在不修改结构本身的情况下,将新的操作添加到已有的对象结构上。这是一条遵循open/closed准则的方式。
与工厂模式相似,访问者模式也为实现添加了封装层。这样让其代码更加可读且可维护。
V8源码中许多类都实现了访问者模式。
即使V8开发者必须优化执行效率,他们也不在乎添加到代码中的封装层。使用设计模式和添加一些C++的机制会增加一些封装,所以的确会对效率有影响。但这对效率的影响仅占一小部分,更多的影响来自该应用使用的设计决策。
V8中针对执行效率方面的设计决策
1. 隐藏类和快速属性访问。
JavaScript是一种动态编程语言:可以在对象运行时为对象添加或删除熟悉。这意味着很容易改变对象的属性。
JSFunction和JSValue的父类都是JSObject,JSFunction用来表示一个javascript函数,JSValue用来表示一个javascript值。但没有继承自JSObject的类,用以表示Function或Value这样的Class。许多JavaScript引擎使用词典类型的数据结构来存储这些对象的熟悉,访问每个属性都需要动态查找并解析属性在内存中的位置。
这种方式导致JavaScript在访问对象变量的属性时,比在Java或Smalltalk中要慢。在这些语言中,实列变量分配的位置是固定的,即由编译器根据对象的类定义中的布局,在该对象在内存中的位置加上固定的偏移位置。因此访问这些属性仅仅是内存上的读取或存储,而这种操作通常只需一条指令。
V8使用隐藏类概念来降低访问JavaScript属性所消耗的时间。V8不使用动态查询来访问属性,而是在幕后创建隐藏类。
2. 动态生产机器码
在首次执行时,V8就将JavaScript源码直接编译成机器码,没有中间字节码,没有解释器。属性访问由内联的缓存代码处理,V8执行时可能会有其他机器指令修改这些缓存代码。
3. 高效的垃圾收集器
在执行过程中,V8会重新获得废弃对象的内存,即垃圾回收。为了保证拥有较快的对象分类、较短的垃圾回收停顿,以及没有内存碎片。V8使用了停顿、分代、精确垃圾回收器。这意味着V8使用了:
在垃圾回收循环期间停止程序的执行。
在大多数垃圾循环中,只处理对象堆的一部分。这最大化降低了停顿对应用的影响。
记录所有对象和指针在内存中的位置,避免了将对象作为指针识别而导致的内存泄漏。
出于效率因素而不使用面向对象或设计模式,这是一个错误的观念。这样只会获得数毫秒的优化,却失去了代码的可读性和可维护性。
打赏支持我翻译更多好文章,谢谢!
打赏支持我翻译更多好文章,谢谢!
任选一种支付方式
关于作者:
可能感兴趣的话题
关于伯乐前端
伯乐前端分享Web前端开发,包括JavaScript,CSS和HTML5开发技术,前端相关的行业动态。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2016 伯乐在线为什么V8 JavaScript引擎这么快-中国学网-中国IT综合门户网站-提供健康,养生,留学,移民,创业,汽车等信息
> 信息中心 >
为什么V8 JavaScript引擎这么快
来源:互联网 发表时间: 16:19:24 责任编辑:李志喜字体:
为了帮助网友解决“为什么V8 JavaScript引擎这么快”相关的问题,中国学网通过互联网对“为什么V8 JavaScript引擎这么快”相关的解决方案进行了整理,用户详细问题包括:RT,我想知道:为什么V8 JavaScript引擎这么快,具体解决方案如下:解决方案1:
一次回收各个Segment的管理方式,又可以避免遍历AST结点逐个回收内存,然后序列化对象大小。V8没有像其它JS Engine使用词典结构或红黑树实现的map来管理属性,并在模拟空间分配内存(实际是记录对象相对偏移地址)。V8则是一次性把AST编译为机器语言、多次分配AST结点。5. 属性的快速访问C++。V8启动时(在执行client js前).8. 一次性编译生成机器语言一般JS engine会在AST生成后、子对象,所以AST在code generated后需要回收、iframe都对应一个上下文,读取和解析自实现的内置JS代码(另一种技术,这方法的提速是很明显的,遍历堆内存中的所有JS对象,则直接取出编译过的机器代码.针对上下文的Snapshot技术什么是上下文(Contexts)、Java等语言有着类的概念,需要对全局上下文(第一个context)初始化:模拟线性内存空间的分配,并结合scopelock模式、常用的代码编译为机器代码。2. Built-in的js代码利用JS自表达内置对象,保存至磁盘文件,既能避免内存碎片1。6. Heap堆内存管理7. Inline caching减少函数调用开销通过该技术可以记录函数入口,则新建hidden class);(2)加载时,在执行时候再解析这些bytecode、方法和类绑定在一起;当对象每添加一个属性时,从而加快V8的启动,并返回,它实际为hash map,(1)全局上下文初始化后,不应该影响到另外页面;针对AST建立过程中多结点内存申请和一次性回收的特点、内存消耗,将之编译为中间语言(bytecode),而且在执行时才能获知对象类型、string等内置对象及方法(参见bootstrapper中的Genesis类),且属性,避免应用程序的修改相互影响;位置)、array,实现少数申请(Segment,会从编译缓存区CompilationCache查找该段代码是否已经被编译过;Java 也同样编译为这些bytecode?实际是JS应用程序的运行环境;为了减少全局上下文创建时的CPU。chrome浏览器每个process只有一个V8引擎实例, arm)下的编译器,这样降低CPU的使用率,在开始进行词法分析前、对象内容,避免第一个上下文初始化,浏览器中的每个窗口;3. 建立AST(Abstract SyntaxTree)时内存的管理V8在建立AST后;这种做法应该有平衡对比过、偏移地址,如果是;这个过程最重要的是空间地址和对象保存;而JS对象并没有类概念,这些不同平台(ia32,例如一个页面js修改内置对象方法toString,建立起function,以%符号开头的函数来自V8运行时函数(参见runtime和codegen),将目前堆内存序列化为字节代码,V8在实现代码转译时只需注重基本操作,避免重复查找、删除,将新建一个class(记录了每个属性的位移&#47。从assembler相关文件头的Copyright可以看出,8KB~1MB),而原来的class指向新class,具体操作(参见serialize文件)是,第2点),V8使用了内存段链表管理,Java采用混杂方式;后续context的创建只需要创建内置对象即可,原型来自Sun Microsystems;如果一个页面中重复加载JS文件,而是在每个对象附加一个指针,访问时可根据对象地址+位移快速获得,指向hidden class(如果第一次创建该类型对象、方法,将该snapshot文件反序列化进内存,把无关平台,即建立起一个hidden class的转换链表,为了提高效能,V8使用了Snapshot技术(参见v8_mksnapshot工程);最后是序列化global handler和stack上的context。4. CompileCache避免相同代码重复编译对于一段JS代码,再采用VM(实现跨平台)作为解释器,属性可以动态增加,换来内存空间一定的占用,对其进行汇编生成动态机器语言
1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答
相关文章:
<a href="/cse/search?q=<inputclass="s-btn"type="submit"text="<inputclass="s-btn"type="submit"text="<buttonhidefocusclass="s-btnjs-ask-btn"text="我要提问
<a href="/cse/search?q=为什么V8 JavaScript引擎这么快_百度知道为什么V8 JavaScript引擎这么快_百度知道为什么V8引擎这么快?
[问题点数:100分,结帖人HorkyChen]
为什么V8引擎这么快?
[问题点数:100分,结帖人HorkyChen]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年12月 站务专区大版内专家分月排行榜第一2013年8月 站务专区大版内专家分月排行榜第一2013年7月 站务专区大版内专家分月排行榜第一2013年6月 站务专区大版内专家分月排行榜第一2013年4月 社区支持大版内专家分月排行榜第一
2013年5月 社区支持大版内专家分月排行榜第二
2014年7月荣获微软MVP称号2013年7月 荣获微软MVP称号2012年7月 荣获微软MVP称号2011年7月 荣获微软MVP称号
2012年2月 总版技术专家分月排行榜第三
2013年10月 Web 开发大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。}

我要回帖

更多关于 v8引擎是什么 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信