v8 TurboFan带来的优化

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的效果
    • 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)中已经被解决了。

你可能感兴趣的:(v8 TurboFan带来的优化)