QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

JavaScript 执行效率不行?因为你还没用 V8 | 极客时间

  • 2020-03-17
  • 本文字数:1956 字

    阅读完需:约 6 分钟

JavaScript 执行效率不行?因为你还没用 V8 | 极客时间

我是李兵,现在是一名创业者,也是一位工程师。


去年,我写了一个专栏《浏览器工作原理与实践》,其中提到了 V8 是如何执行 JavaScript 代码的。我发现,不少朋友都对 V8 很感兴趣,对这部分的学习意犹未尽,因此,今天我来跟你深入聊聊 V8。


V8 是 Google 开源的 JavaScript 引擎。全球超过 25 亿台安卓设备都在使用 Chrome 浏览器,所以我们写的 JavaScript 应用,大都跑在 V8 上。作为当下使用最广泛的 JavaScript 引擎,V8 的生态圈也非常庞大,这与它革命性的设计密不可分。


在 V8 出现之前,所有 JavaScript 引擎用的都是解释执行的方式,这是 JavaScript 执行速度过慢的主要原因;而 V8 率先引入即时编译(JIT)的双轮驱动设计,混合编译执行和解释执行两种手段,为 JavaScript 的执行速度带来了极大提升。


V8 出现后,各大厂商也纷纷在 JavaScript 虚拟机中引入了 JIT 机制。 可以说,V8 的出现将 JavaScript 虚拟机技术推向了一个全新的高度。


但我发现,大部分人在运行 V8 时,只是单纯使用 JavaScript 和调用 Web API,并不了解这个“黑盒”内部是如何工作的。一旦项目出现问题,很难找到有效的解决策略,比如:项目占用内存过高,或页面响应速度过慢,又或者使用 Node.js 时,任务被阻塞等等。只有熟悉 V8 的工作机制,才会有系统性的思路来解决这些问题。


所以,我推出了第二个专栏《图解 Google V8》。在专栏中,我完整梳理了 V8 的核心知识体系,通过大量图片演示,深入浅出地讲解 V8 执行 JavaScript 代码的底层机制和原理。


跟我学完这门课,你不仅可以了解完整的 V8 编译流水线,还会搞懂 JavaScript 语言的核心特性,进而从根源上解决程序问题,加快 JavaScript 的执行速度。

我是谁?

我是李兵,《浏览器工作原理与实践》专栏作者,前盛大创新院高级研究员,在浏览器和前端开发领域深耕了十余年。曾在盛大创新院参与 WebOS 项目,在顺网科技带领团队打造了一款给全国网吧使用的“F1 浏览器”,目前致力于为企业提供前端项目咨询和浏览器研发的基础服务。

我是如何讲解 Google V8 的?

刚刚我们提到过,V8 的主要职责是执行 JavaScript 代码。所以,首先我们要了解 JavaScript 的基本特性和设计思想。


JavaScript 是一门优秀的语言,借鉴了其他语言的优质特性,特别是“原型继承机制”和“函数是一等公民”这两个设计。



△ JavaScript 的设计思想


与此同时,JavaScript 也是一门处处是「坑」的语言,比如:使用 new 加构造函数来创建对象时,背后隐藏的很多细节,都会增大代码的出错概率;初期的 JavaScript 没有块级作用域机制,需要采取变量提升策略,而变量提升又是非常反人性的设计,等等。


所以,我们在学习 V8 时,要格外关注 JavaScript 这些独特的设计思想,及其特性背后的实现。


深入分析过 JavaScript 语言后,我们还要掌握 V8 执行 JavaScript 代码的完整流程,也就是 V8 的编译流水线,其完整流程如下图:



△ V8 的编译流水线


编译流水线本身并不复杂,但其中涉及很多技术,比如 JIT、延迟解析、隐藏类、内联缓存等等,它们决定了一段 JavaScript 代码能否正常执行,及其执行效率。


举个例子,V8 使用的隐藏类(Hide Class) 可将 JavaScript 中的动态类型转换为静态,有效解决了动态类型语言的执行速度过慢问题。如果你熟悉 V8 的工作机制,就能充分利用好隐藏类这种强大的优化特性,写出更加高效的代码。


再比如,为了加快代码的启动速度,V8 实现了 JavaScript 代码的惰性解析。通过学习惰性解析机制,你可以优化代码以更加适应这个机制,从而提高程序的性能。


最后,我们要了解 V8 另外两个重要特性:事件循环系统垃圾回收机制。


事件循环系统与 JavaScript 中的难点——异步编程紧密相关。我们知道,JavaScript 是单线程的,如果同一时间发送了多个 JS 的执行请求,就要排队,也就是异步编程。而 V8 的事件循环系统会调度这些排队任务,保证 JavaScript 代码被 V8 有序地执行。


因此可以说,事件循环系统是 V8 的心脏,驱动着 V8 持续工作。


另外,JavaScript 是一门自动垃圾回收的语言。V8 在执行垃圾回收时,会占用主线程资源,如果我们编写的程序频繁触发垃圾回收,就会阻塞主线程。而在我们了解 V8 如何分配并回收内存数据后,就能打通整个链路,掌握系统排查问题的方法。



△ 高清版图谱的领取方式,请见文末


结合以上内容,我总结了一份 V8 高效学习路径。通过这张图谱,你可以对 V8 的知识体系有更加直观的理解,同时明确每部分的核心知识点。


在专栏《图解 Google V8》中,我也会按照这样的思路讲解,帮你构建完整系统的知识体系,彻底拿下 V8。


现在订阅,有什么福利?

1.早鸟优惠 ¥55,原价 ¥68。结算时输入优惠口令「googlev88」,优惠基础上 再减 ¥5到手价 ¥50,仅限 「前 200 人」有效,戳此抢购>>>


2.订阅专栏后,生成分享海报,每成功邀请 1 位好友订阅,可得 ¥18 返现


2020-03-17 13:012804

评论 1 条评论

发布
暂无评论
发现更多内容

酱香型白酒怎么选?唐庄酒告诉你答案

Geek_50a546

美联储最新货币政策,将如何影响比特币市场?

CECBC

蚂蚁金服内部的Spring Cloud Alibaba手册,面面俱到,太全了

Java 程序员 架构 面试 微服务

进击的云原生,为开发者提供更多可能性

阿里巴巴云原生

联邦计算在百度观星盘的实践

百度开发者中心

百度 联邦计算

联邦学习这件小事(二)

趣链科技

区块链 隐私保护 加密技术 联邦计算

Redis套路,一网打尽

Coder的技术之路

redis 缓存 面试

Flink State 和 Fault Tolerance(四)

Alex🐒

flink flink1.13

Cilium 首次集成国内云服务,阿里云 ENI 被纳入新版本特性

阿里巴巴云原生

容器 运维 云原生

微信小游戏直播在Android端的跨进程渲染推流实践

JackJiang

微信 即时通讯 直播技术

零售的私域「留量」时代,SaaS的「服务」未来

ToB行业头条

细节爆炸!阿里企业级Spring Security机密文档

Java 程序员 架构 面试 微服务

从最难的而立之年走来,三十而已 —— 2021 年中总结

清秋

成长与思考 年中总结

英特尔谢晓清:开源是软件发展趋势

E科讯

融云发布语聊房SDK 1.0 & Demo 满足开发者开箱即用需求

融云 RongCloud

如何做好业绩管理?

石云升

职场经验 管理经验 6月日更

融云CTO任杰:强互动,RTC下一个“爆点”场景

融云 RongCloud

华为实习结束后,鹅厂和字节跳动递来的offer让我手足无措

Java 程序员 架构 面试

BZZ云算力挖矿系统开发案例

网络攻防学习笔记 Day51

穿过生命散发芬芳

网络攻防 6月日更

唐庄酒业的酒好喝吗?纯粮酿造好味道

Geek_50a546

1.5w字 + 24张图肝翻 TCP

苹果看辽宁体育

TCP 大前端 后端 计算机网络

数字人民币对地铁App的影响分析

CECBC

2021春招面试经历,阿里3轮技术面+交叉3面(已成功拿到offer)

Java 程序员 架构 面试

案例 | 低代码助力生产制造业,扫平数字化升级“死角”!

优秀

低代码 生产管理系统

从字节跳动到火山引擎(二):私有云 PaaS 场景下的 Kubernetes 集群部署实践

字节跳动 云原生 #Kubernetes# 火山引擎

从字节跳动到火山引擎(三):替换 Spring Cloud,使用基于 Cloud Native 的服务治理

字节跳动 微服务 云原生 Spring Cloud 火山引擎

我试了试用 SQL查 Linux日志,好用到飞起

程序员小富

Java Linux 日志

利用 iOS 14 Vision 的手势估测功能 实作无接触即可滑动的 Tinder App

iOSer

ios ios开发 iOS 14 Vision Tinder App

年份白酒推荐 商务聚会我选唐庄五星酒

Geek_50a546

四川比特币矿机或全线关机,矿工跟矿机说:Bye,See you

CECBC

JavaScript 执行效率不行?因为你还没用 V8 | 极客时间_架构_李兵_InfoQ精选文章