为什么V8引擎这么快

全部回答2
默认 最新
  • v8和v10指的是引擎里的气缸数 缸数 汽车发动机常用缸数有3、4、5、6、8、10、12缸。排量1升以下的发动机常用三缸,1-2.5升一般为四缸发动机,3升左右的发动机一般为6缸,4升左右为8缸,5.5升以上用12缸发动机。 一般来说,在同等缸径下,缸数越多,排量越大,功率越高;在同等排量下,缸数越多,缸径越小,转速可以提高,从而获得较大的提升功率。 6-12缸发动机一般采用v型排列,其中v10发动机主要装在赛车上。v型发动机长度和高度尺寸小,布置起来非常方便,而且一般认为v型发动机是比较高级的发动机,也成为轿车级别的标志之一。v8发动机结构非常复杂,制造成本很高,所以使用的较少,v12发动机过大过重,只有极个别的高级轿车采用。 2006赛季f1赛车引擎由3.0升v10变为2.4升v8,目的是为了降低各车队的引擎研发等开支,同时提高比赛安全性。此项规则改动将导致引擎输出功率相比2005赛季(900马力左右)降低约200马力。对于无法在2006赛季开始时获得新规则规定的v8引擎的车队,也允许其在限制引擎转速的情况下,使用符合2005赛季技术规则的v10引擎。
    0 点赞
  • 1.针对上下文的Snapshot技术什么是上下文(Contexts)?实际是JS应用程序的运行环境,避免应用程序的修改相互影响,例如一个页面js修改内置对象方法toString,不应该影响到另外页面。chrome浏览器每个process只有一个V8引擎实例,浏览器中的每个窗口、iframe都对应一个上下文。V8启动时(在执行client js前),需要对全局上下文(第一个context)初始化,读取和解析自实现的内置JS代码(另一种技术,第2点),建立起function、array、string等内置对象及方法(参见bootstrapper中的Genesis类);后续context的创建只需要创建内置对象即可;为了减少全局上下文创建时的CPU、内存消耗,V8使用了Snapshot技术(参见v8_mksnapshot工程),(1)全局上下文初始化后,将目前堆内存序列化为字节代码,保存至磁盘文件;这个过程最重要的是空间地址和对象保存,具体操作(参见serialize文件)是:模拟线性内存空间的分配,遍历堆内存中的所有JS对象,并在模拟空间分配内存(实际是记录对象相对偏移地址),然后序列化对象大小、偏移地址、子对象、对象内容;最后是序列化global handler和stack上的context;(2)加载时,将该snapshot文件反序列化进内存,避免第一个上下文初始化,从而加快V8的启动。2. Built-in的js代码利用JS自表达内置对象、方法,V8在实现代码转译时只需注重基本操作,以%符号开头的函数来自V8运行时函数(参见runtime和codegen);3. 建立AST(Abstract SyntaxTree)时内存的管理V8在建立AST后,对其进行汇编生成动态机器语言,所以AST在code generated后需要回收;针对AST建立过程中多结点内存申请和一次性回收的特点,V8使用了内存段链表管理,并结合scopelock模式,实现少数申请(Segment,8KB~1MB)、多次分配AST结点、一次回收各个Segment的管理方式,既能避免内存碎片,又可以避免遍历AST结点逐个回收内存。4. CompileCache避免相同代码重复编译对于一段JS代码,在开始进行词法分析前,会从编译缓存区CompilationCache查找该段代码是否已经被编译过,如果是,则直接取出编译过的机器代码,并返回,这样降低CPU的使用率,换来内存空间一定的占用;如果一个页面中重复加载JS文件,这方法的提速是很明显的;这种做法应该有平衡对比过。5. 属性的快速访问C++、Java等语言有着类的概念,且属性、方法和类绑定在一起,访问时可根据对象地址+位移快速获得;而JS对象并没有类概念,它实际为hash map,属性可以动态增加、删除,而且在执行时才能获知对象类型。V8没有像其它JS Engine使用词典结构或红黑树实现的map来管理属性,而是在每个对象附加一个指针,指向hidden class(如果第一次创建该类型对象,则新建hidden class);当对象每添加一个属性时,将新建一个class(记录了每个属性的位移/位置),而原来的class指向新class,即建立起一个hidden class的转换链表。6. Heap堆内存管理7. Inline caching减少函数调用开销通过该技术可以记录函数入口,避免重复查找.8. 一次性编译生成机器语言一般JS engine会在AST生成后,将之编译为中间语言(bytecode),在执行时候再解析这些bytecode;Java 也同样编译为这些bytecode,再采用VM(实现跨平台)作为解释器,为了提高效能,Java采用混杂方式,把无关平台、常用的代码编译为机器代码。V8则是一次性把AST编译为机器语言。从assembler相关文件头的Copyright可以看出,这些不同平台(ia32, arm)下的编译器,原型来自Sun Microsystems。
    0 点赞

没有更多内容了

返回顶部
产品求购 求购