A:Node.js 是指运于 web 服务端的 JavaScript,基于 Chrome V8 引擎,有非阻塞,事件驱动 I/O 等特性。javascript
A:JavaScript 引擎是执行 JavaScript 代码的程序或解释器,JavaScript 引擎能够实现为标准解释器,或者以某种形式将 JavaScript 编译为字节码的即时编译器。它的工做流程大体以下:java
Chrome V8 引擎即是其中一种,由 Google 开发,使用 C++ 编写,它的工做流程几乎与上图一致:git
相比于其它 JavaScript 引擎转换成字节码或者解释执行,V8 将 JavaScript 代码转换成更高效的机器码(IA-32, x86-64, ARM, or MIPS CPUs)。它经过 JIT(Just-In-Time)编译器实现,不生成字节码或任何中间代码。而且使用了如 Inlining、Shapes、Inline Caches 等方法来提升性能。github
A:好比 Shapes 与 Inline Caches 用来优化对象属性加载。web
A:ECMAScript 规范基本上将全部对象定义为由字符串键值映射到 property 属性的字典,其中 [[]]
双方括号是规范定义不能直接暴露给 JavaScript 的属性的表示方法。session
A:不不不,若是在内存中这么存储,那就浪费空间了。好比说有相同形状的对象 object = { x: 7, y: 8 }
,它们的属性名是相同的,而且在属性值的完整字典中,也只有 [[value]]
不一样。ide
[[value]]
以外的全部属性名和其他特性单独存储。而且它须要有一个属性,来告知 JavaScript 引擎去哪查找具体的值。A:是的,引擎将对象的 Shape
分开存储,以下 JSObject 只是存储 [[value]]
,Shape
中有一个 Offset
偏移量来告知 JavaScript 取哪找具体的值:函数
当有多个具备相同形状对象时,优点变得清晰可见。由于只须要将它们的形状与键值属性信息存储一次!性能
A:关系大了,Shapes 主要是用来实现 Inline Caches(ICs)的,Inline Caches 是 JavaScript 快速运行的关键因素之一。优化
A:好比有一个从对象中获取 x 属性的函数,在 JSC(JavaScriptCore) 中执行时,会生成如下字节码:
Inline Caches 在第一个指令 get_by_id
指令中,由两个未初始化的插槽组成。
当调用函数 getX({ x: 'a' })
时,像前面所说,对象 { x: 'a' }
有一个包含属性 x
的 Shape,该 Shape 包含属性 x 的偏移量和其它特性,当第一次执行该函数时,会把该属性的 Shape 和 偏移量存储在 Inline Caches 中:
后续调用该函数时,Inline Caches 只须要对比 Shape,若是与之前相同,则只须要从偏移量加载该属性值。这比每次查找要快不少。
A:V8 所作的,远不止这些,在即将要发布的 7.2 版本中,解析时间明显下降,缩短加载时间,提升响应速度:
A:......
未完待续