??V8?是一个全新的Google 的开源?JavaScript 引擎,它在设计之初就以高效地执行大型的?JavaScript?应用程序为目的。在一些性能测试中,V8 比?Internet Explorer?的?JScript?、Firefox?(IE?9使用JS引擎为:Chakra引擎)中的 SpiderMonkey (火狐4.0后用的JS引擎为JaegerMonkey)以及?Safari?中的 JavaScriptCore 要快上数倍。
V8 采用 C++ 编写,可在谷歌浏览器(来自 Google 的开源浏览器)中使用。
V8 根据 ECMA-262 第三版中的说明使用 ECMAScript,并在使用 IA-32 或 ARM 处理器的 Windows XP 和 Vista、Mac OS X 10.5 (Leopard) 以及 Linux 系统中运行。
V8 可以独立运行,也可以嵌入任何 C++ 应用程序中。
V8性能的3个关键方面:
- 快速属性访问
- 动态生成机器码
- 高效的垃圾回收
快速属性访问
???? JavaScript 是一门动态语言,属性可以在运行时添加到或从对象中删除。这意味着对象的属性经常会发生变化。大部分 JavaScript 引擎都使用一个类似于字典的数据结构来存储对象的属性,这样每次访问对象的属性都需要进行一次动态的字典查找来获取属性在内存中的位置。这种实现方式让 JavaScript 中属性的访问比诸如 Java 和 Smalltalk 这样的语言中的成员变量的访问慢了许多。成员变量在内存中的位置离对象的地址的距离是固定的,这个偏移量由编译器在编译的时候根据对象的类的定义决定下来。因此对成员变量的访问只是一个简单的内存读取或写入的操作,通常只需要一条指令即可。
???? 为了减少 JavaScript 中访问属性所花的时间,V8 采用了和动态查找完全不同的技术来实现属性的访问:动态地为对象创建隐藏类。这并不是什么新的想法,基于原型的编程语言 Self 就用 map 来实现了类似的功能。在 V8 里,当一个新的属性被添加到对象中时,对象所对应的隐藏类会随之改变。
?
?动态机器码生成
V8 在第一次执行 JavaScript 代码的时候会将其直接编译为本地机器码,而不是使用中间字节码的形式,因此也没有解释器的存在。属性访问由内联缓存代码来完成,这些代码通常会在运行时由 V8 修改为合适的机器指令。
?高效的垃圾收集
V8 会自动回收不再被对象使用的内存,这个过程通常被称为“垃圾收集(Garbage Collection)”。为了保证快速的对象分配和缩短由垃圾收集造成的停顿,并杜绝内存碎片,V8 使用了一个 stop-the-world, generational, accurate 的垃圾收集器,换句话说,V8 的垃圾收集器:
- 在执行垃圾回收的时候会中断程序的执行。
- 大部分情况下,每个垃圾收集周期只处理整个对象堆的一部分,这让程序中断造成的影响得以减轻。
- 总是知道内存中所有的对象和指针所在的位置,这避免了非 accurate 的垃圾收集器中普遍存在的由于错误地把对象当作指针而造成的内存溢出的情况。