v8 TurboFan带来的优化
2017-12-18 本文已影响22人
mengxr
v8 TurboFan带来的优化
- Javascript 引擎 V8 即将采用新的引擎: TurboFan & Ignition
- TurboFan是新的编译器
- Ignition是新的解释器
- TurboFan带来的好处
-
大幅度减低使用try catch带来的性能问题
- [图片上传失败...(image-1d34dc-1513587327586)]
- 对象delete操作
- delete的问题在于:
- V8 引擎为了提高属性和对象的处理速度,在 C++ 层面基于对象的“结构”为对象创建了 C++ 类
- 这种优化是发生在运行时的,如果一个对象的“结构”是不确定的,那么 V8 就无法为其创建
hidden classes
- 只能使用另一种慢地多的方式即哈希表查找的方式来进行属性获取
- 当我们从对象中delete一个属性之后,后续的属性查找模式就会变成哈希表查找。
- 当我们从对象中delete一个属性之后,后续的属性查找模式就会变成哈希表查找。无法享受V8引擎为了优化对象处理速度,所创建的�
hidden classes
- 优化方案:我们通过把要移除的属性赋值undefined来达到类似delete的效果
- delete的问题在于:
-
arguments
- arguments是一种类数组对象结构
- 之前arguments去优化的点
- 类数组对象转换为数组
- 暴露arguments,或者说正如在
Array.prototype.slice.call(arguments)所做的一样,arguments对象被传送给了另一个函数
- 现在
- 类数组对象转换为数组
- 在 Node 8.3 或者更高版本我们应该使用
spread
操作符。而在 Node 8.2 和更低版本上,我们应该使用for 循环
来把 arguments中的值复制到一个新的(已经预分配了空间的)数组中去 - 在 Node 8.3+ 版本上,把 arguments对象暴露给其它函数不再会导致性能下降
- Array.prototype.slice.call(arguments) 性能比较低
- [图片上传失败...(image-e3da04-1513587327586)]
- debugger
- previous:遗留在代码里的的debugger会降低性能
- current:所有的V8 版本上都带来了巨大的性能下降
- [图片上传失败...(image-d65101-1513587327586)]
-
遍历
- previous:for-in速度远远快于其他方式
- current:,for-in的速度直线下降到了之前的四分之一,Object.keys超过了for-in
- [图片上传失败...(image-8d9d11-1513587327586)]
- 创建类
- 使用对象字面值创建对象, 用一个 EcmaScript 2015 类来创建对象, 使用构造函数来创建对象速度差不多
- Node 8.2(V8 5.8)上使用类的方式明显慢于其它方式
- 这是由于在 V8 5.8 上混合使用 Crankshaft 和 Turbofan 所致,这个问题在 Node 8.3(V86.0)中已经被解决了。
-
大幅度减低使用try catch带来的性能问题