JavaScript为什么快--第一篇?

作者: 阿里云云栖号 | 来源:发表于2018-08-14 14:04 被阅读90次

    摘要: V8让JavaScript更快的秘密;V8的JavaScript执行管道;TurboFan&Ignition

    为啥升级了NodeJS版本,速度会提升?

    为啥NodeJS代码启动时那么慢,运行起来了会变快?

    V8 JIT是啥?

    前言

    V8的产品定义:Speed up real-world performance for modern JavaScript, and enable developers to build a faster future web.

    最近看了V8核心小组3个视频,感觉很有价值,做一次搬运工(英语好的同学可以自行观赏),我计划将3个视频分为3篇文章来:

    • 第一篇来源,V8小组的产品经理;V8, Advanced JavaScript, & the Next Performance Frontier (Google I/O '17)

    • 第二篇来源,V8的语法解析;Parsing JavaScript - better lazy than eager?

    • 第三篇来源,V8的编译运行;How JavaScript Engines Work

    后语

    先将结论放出来:

    V8的执行管道架构图 

    1.、V8语法解析阶段:

    JS的语法解析速度: 大约1MB/s;400k的JS代码,语法解析就需要~370ms

    可以通过,检查你代码的语法解析时间

    运行的代码尽量少:-)

    2、V8编译阶段:

    尽量写"静态类型"的代码

    WebAssembly 使用了TurboFan

    3、V8 JS编码:

    Async/Await(4.5x) 比 Generators(2.5x) 快几乎2倍

    ES2015的速度越来越接近ES5

    4、V8 for NodeJS:

    异步调试代码: node --inspect app.js && chrome://inspect/#devices

    5、V8 for browser:

    Coverage功能,检查运行代码的覆盖率

    第一篇:why V8? - V8产品经理的描述

    作为第一篇,我们先看看V8的产品经理是怎么看待V8引擎的。

    全局介绍V8的代码执行管道的架构。

    V8的衡量标准

    作为JS引擎,不光要考虑性能攀升,还需要考虑启动速度,内存使用率。V8的产品经理给出了他们衡量V8引擎的模型和V8的使用场景。

    场景一:

    执行只有一个函数;期望快速启动语法分析并且编译运行;

    场景二:

    执行一万次foo函数;在PC浏览器/NodeJS服务器中,期望高性能运行foo函数;

    执行一万次foo函数;在手机浏览器/NodeJS IoT设备中,期望低内存,较高性能运行foo函数;

    V8的执行管道

    V8到底怎么做到在快速启动/性能巅峰,低内存/高优化内存的各个档位之前任意切换的呢?

    TurboFan(涡轮增压)

    V8的优化编译器,积累了3年以上

    • 用于提升代码性能

    • 支持并优化Es2015+特性

    • WebAssembly的后台

    Ignition(点火器)

    占用少量内存,快速启动

    • 原先设计用于低内存的设备,现在用于所有平台节省内存;

    • 快速生成二进制代码,提升页面启动速度;

    • 结合TurboFan使快速启动和性能优化更简单;

    Ignition+TurboFan

    2017年全新的JavaScript pipeline

    • JS代码更快

    • 更少内存

    • 更全新的性能提升

    • 更适合NodeJS

    • 不再拖欠JS新增功能

    • 重写内置函数(高达4倍提速)

    Orinoco

    几乎平行并发的压缩算法GC

    • 平行压缩,平行指针更新,避免新旧生代频繁更新提升页面速度,并发交换

    • 马上支持:并发标记

    Speedometer2

    V8用于的更适合测试JS的benchmarks

    • 测试流行MVC框架的最新版本TodoList

    • 几乎(谦虚)是最好的浏览器benchmarks

    优化ES2015

    • Generators提升2.5倍速度

    • Async/Await提升4.5倍速度

    • Promise提升4倍速度

    V8 love NodeJS

    V8是NodeJS委员会的核心成员,持续提升优化NodeJS的性能

    AcmeAir benchmark

    NodeJS的benchmark

    Node + DevTools

    更容易调试NodeJS的代码

    • 启动时加--inspect参数node --inspect index.js

    • 通过chrome地址栏的about:inspect链接调试node代码

    • 支持异步调试,profiling和更多功能

    Code Coverage功能

    查看哪些代码没有被执行

    WebAssembly

    安全跨浏览器的原生代码

    • Chrome和FireFox支持,未来包括:Edge和Safari

    • 通过Emscripten toolchain编译C/C++到web

    • 未来计划:更好的性能;更容易从Response object实例化;支持共享ArrayBuffers(Chrome 60)

    小结

    JavaScript的执行性能,依赖环境和上下文。

    Ignition+TurboFan+Webassambly,可以让V8在快速启动/性能巅峰;低内存/高优化内存;各个档位之前任意切换;

    本文作者:秦粤

    阅读原文

    本文为云栖社区原创内容,未经允许不得转载。

    相关文章

      网友评论

        本文标题:JavaScript为什么快--第一篇?

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