美文网首页
v8 TurboFan带来的优化

v8 TurboFan带来的优化

作者: mengxr | 来源:发表于2017-12-18 16:56 被阅读22次

    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带来的优化

          本文链接:https://www.haomeiwen.com/subject/kxgqixtx.html