JavaScript 执行效率不行?因为你还没用 V8

Stella981
• 阅读 912

作为当下使用最广泛的 JavaScript 引擎,V8 的生态圈非常庞大,这与它革命性的设计密不可分。

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

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

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

只有熟悉 V8 的工作机制,才会有系统性的思路来解决这些问题,分享给你一张 V8 的高效学习路径图,通过这张图谱,你可以对 V8 的知识体系有更加直观的理解,同时明确每部分的核心知识点。

JavaScript 执行效率不行?因为你还没用 V8

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

这张图谱出自李兵,之前看过他的专栏《浏览器工作原理与实践》,感觉收获很大,把我对于浏览器的疑惑都串了起来,非常系统。最近,得知他又出了第二季专栏《图解 Google V8》,看了专栏的目录和部分内容,很想推荐给你。

在专栏中,他完整梳理了 V8 的核心知识体系,而且延续了第一季的风格——通过大量图片演示,深入浅出地讲解 V8 执行 JavaScript 代码的底层机制和原理。

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

JavaScript 执行效率不行?因为你还没用 V8

👆扫码免费试读

结算时输入优惠口令「googlev88」

到手仅 ¥50 ,仅限 「前 50 人」 有效

李兵是谁?

==================

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

他是如何讲解 V8 的?

=========================

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

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

所以,想系统学习 V8,就要关注 JavaScript 这些独特的设计思想,还有其特性背后的实现。

接下来,我们要掌握 V8 执行 JavaScript 代码的完整流程,也就是 V8 的编译流水线,其完整流程如下图(ps.图片出处是李兵的 V8 专栏):

JavaScript 执行效率不行?因为你还没用 V8 △ V8 的编译流水线

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

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

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

事件循环系统与 JavaScript 的难点——异步编程紧密相关。JavaScript 是单线程的,如果同一时间发送了多个执行请求,就要排队,也就是异步编程。而 V8 的事件循环系统会调度这些排队任务,保证 JavaScript 代码被有序地执行。所以,事件循环系统是 V8 的心脏,驱动着 V8 持续工作

另外,JavaScript 是一门自动垃圾回收的语言。V8 在执行垃圾回收时,会占用主线程资源,如果程序频繁触发垃圾回收,就会阻塞主线程。如果我们了解 V8 如何分配并回收内存数据,就能打通整个链路,遇到任何内存问题,都知道从哪里开始排查

李兵的专栏《图解 Google V8》就是按上面的思路讲解的,跟着好好学,结合课程中的练习实践,你一定可以构建起完整的知识体系,彻底拿下 V8。

说了这么多,是时候看看目录了:

JavaScript 执行效率不行?因为你还没用 V8

订阅福利

=======

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

2.订阅课程后,可获得作者整理的高清版「V8 核心知识图谱」,获取方式:公众号后台回复「V8」。

JavaScript 执行效率不行?因为你还没用 V8

👇扫码或点「阅读原文」,

输入优惠口令「googlev88」,

以最低价 ¥50 入手,仅限前 50 人。

彩蛋: 本次购买的粉丝加帅编微信,帅编再将自己所得的18元返还, 相当于到手 32 元。

本文分享自微信公众号 - Vue中文社区(vue_fe)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
3年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Node.js 安装与开发
Node.js简介Node.js是一个Javascript运行环境(runtime),发布于2009年5月,由RyanDahl开发,实质是对ChromeV8引擎进行了封装。Node.js对一些特殊用例进行优化,提供替代的API,使得V8在非浏览器环境下运行得更好。V8引擎执行Javascript的速度非常快,性能非常好。Node.j
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这