写点什么

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:012686

评论 1 条评论

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

Java 内推 | 教育行业缺口来了,研发,运维,产品,教研,职能,营销... 别错过

Seachal

Java 内推

使用 Easysearch 打造企业内部知识问答系统

极限实验室

easysearch 征文系列

基于Drone实现CI/CD【0到1架构系列】

不在线第一只蜗牛

Java 架构 CI/CD

TinyVue 组件库官网焕然一新!

OpenTiny社区

Vue 组件库 OpenTiny

以太坊 ETF 获批:如何影响 Web3

股市老人

Spring 常用的三种拦截器详解

快乐非自愿限量之名

Java spring Spring Boot

照明黑马智谋纪,让小白玩转AI照明

编程猫

TapData 信创数据源 | 国产信创数据库 TiDB 数据迁移指南,加速国产化进程,推进自主创新建设

tapdata

8款好用的PPT免费生成器推荐,堪称办公神器!

彭宏豪95

效率工具 职场 PPT AIGC AI生成PPT

InPlant SCADA笔记 day1与首次安装

万里无云万里天

工厂运维 InPlant SCADA

开个技术外挂|电池热失控致电车自燃爆炸?用仿真技术解决它!

Altair RapidMiner

电动汽车 电池 仿真 altair 新能源车

ChinaJoy 2024启动!西部数据展示丰富游戏存储解决方案让发烧友直面各式挑战

Geek_2d6073

低代码应用版本管理能力探讨

鲸品堂

低代码 版本管理工具 版本管理 企业号2024年7月PK榜

“新质互联网”解读:新在哪里,利在何处?

Alter

AutoMQ 开源可观测性方案:夜莺 Flashcat

AutoMQ

云计算 kafka 云原生 Apache Kafka AutoMQ

【YashanDB知识库】如何远程连接、使用YashanDB?

YashanDB

yashandb 崖山数据库 崖山DB

Git的存储原理

快乐非自愿限量之名

git

2024 年美国大选将如何影响 Web3 行业?

股市老人

搭建自动化 Web 页面性能检测系统 —— 部署篇

EquatorCoco

运维 前端 自动化 Web

借助大语言模型快速升级你的 Java 应用程序

亚马逊云科技 (Amazon Web Services)

java

日志框架简介-Slf4j+Logback入门实践

京东科技开发者

让 AI 无处不在,英特尔揭秘 AI 与边缘技术结合的未来画卷

E科讯

从历史到未来,看技术发展趋势

凌晞

技术 科技 构架

fx框架上手-基础篇

FunTester

探索 Milvus 数据存储系统:如何评估和优化 Milvus 存储性能

Zilliz

人工智能 AI Milvus Zilliz 向量数据库

京东工业平台API:关键词搜索京东工业平台商品列表数据接口

tbapi

京东API接口 京东工业平台API 京东工业平台商品列表接口 京东工业平台商品数据接口

源码补丁神器—patch-package

京东科技开发者

记录一次RPC服务有损上线的分析过程

京东科技开发者

精选开源项目管理系统:为您的团队挑选最佳选项

爱吃小舅的鱼

项目管理 开源系统

医疗器械行业数智化创新实践:数据可视化与 AI+ 是实现高质量发展的关键

tapdata

使用线程池你应该知道的知识点

不在线第一只蜗牛

Java 线程池

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