谷歌V8引擎运行机制概览

2023-11-02

最近学习了极客时间上李兵大佬的谷歌V8引擎课程,总结了一下,在公司内部小组分享了一波,在此也分享一下,原理图直接用的专栏的图,由于时间有限,总结略显粗糙

注:解释执行、编译执行各有优缺点:

解释执行,不需要做过多的编译,所以启动快,执行时不时直接运行机器码,顾运行慢;

编译执行,因为编译成机器语言或者更接近于机器语言,耗时更长,顾启动慢,但是喂给cpu的是机器码,所以执行快 

 

注:核心在于监控热点代码,发现多次调用的函数或变量,直接编译成机器码,放在内存中,供下次调用 ,提高了运行速度;不再被调用后,反编译会字节码,释放机器码存放内存,留给接下来的热点代码

 

注:第一段代码,重复调用自己,函数只入栈,而不出栈,出栈的定义:把当前作用于内所有代码执行完毕后才出栈。这里函数a()内部包含log(3)和a(),必须两个函数都执行完毕才会将外层的a出栈,但是等不到出栈,又调用a函数,即又入栈了,所以外层的a永远无法出栈,导致爆栈,即栈溢出。

函数调用者的生命周期总是长于被调用者(后进),并且被调用者的生命周期总是先于调用者的生命周期结束 (先出)

所以站在函数资源分配和回收角度来看,被调用函数的资源分配总是晚于调用函数 (后进),而函数资源的释放则总是先于调用函数 (先出)

入栈是执行,是分配资源的过程,如内存、作用域等;出栈就是释放内存的过程

 

注:因为内存资源宝贵,能分配到连续的内存资源是很难的,所以连续的栈资源比较小,适合存放较小的数据,比如原始数据类型;堆内存比较大,用于存放应用类数据,不要求连续,因为其地址指针放在栈中,就像坐标一样有经纬,不怕找不到。 

 注:采用字节码作为中间代码是不断优化尝试后的结果。

无法较为彻底优化:早期直接把代码转换为二进制机器码,缓存在内存中甚至硬盘中,以空间换时间,但内存占用巨大,且由于编译时只编译顶层代码,内部代码不会被编译,也就不会缓存,对于立即执行函数,无法缓存优化内部代码,移动端内存吃紧的情况下需继续优化

虽然采用字节码在执行速度上稍慢于机器代码,但是整体上权衡利弊,采用字节码也许是最优解。之所以说是最优解,是因为采用字节码除了降低内存之外,还提升了代码的启动速度,并降低了代码的复杂度,而牺牲的仅仅是一点执行效率

 

注: 字节码可根据不同平台转为对应的机器码,不用生成多套机器码,因为不同的 CPU 架构平台ram不同,命令不同,需要不同的机器码

注: 宏任务如:console.log、setTimeout、var、let等;每个宏任务在执行时,V8 都会重新创建栈,然后随着宏任务中函数调用,栈也随之变化,最终,当该宏任务执行结束时,整个栈又会被清空,接着主线程继续执行下一个宏任务。JavaScript 中之所以要引入微任务,颗粒度更细,时效性上更好。怎么理解这句话呢,和以前通过浏览器api setTimeout实现异步编程对比就很直观了,setTimeout是宏任务,他的回调会放到消息队列尾部去排队等待执行,前面不管排了多少个任务都么法,急也没用,谁让你排在后面呢;而微任务的回调则被放在当前宏任务的最后,再怎么说也是和当前宏任务同步执行的,不会说被其它宏任务插队,所以说控制的粒度更细,更精确。但严格来说,不管是现在借助微任务还是以前用setTimeout来实现异步编程,都没法精确控制具体延迟时间的,只能说用微任务更接近于期望值。

注: 打印结果foo bar global mirco-foo micro-bar micro-global  macro-foo macro-bar macro-global

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

谷歌V8引擎运行机制概览 的相关文章

  • Web 安全漏洞之 OS 命令注入

    什么是 OS 命令注入 上周我们分享了一篇 Web 安全漏洞之 SQL 注入 其原理简单来说就是因为 SQL 是一种结构化字符串语言 攻击者利用可以随意构造语句的漏洞构造了开发者意料之外的语句 而今天要讲的 OS 命令注入其实原理和 SQL
  • 38条Web测试经验分享

    1 页面链接检查 每一个链接是否都有对应的页面 并且页面之间切换正确 可以使用一些工具 如LinkBotPro File AIDCS HTML Link Validater Xenu等工具 LinkBotPro不支持中文 中文字符显示为乱码
  • WEB前端常见受攻击方式及解决办法总结

    一个网址建立后 如果不注意安全问题 就很容易被人攻击 下面讨论一下集中漏洞情况和放置攻击的方法 一 SQL注入 所谓的SQL注入 就是通过把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串 最终达到欺骗服务器执行恶意的SQL命
  • 每天10个前端小知识 <Day 7>

    前端面试基础知识题 1 什么是尾调用优化和尾递归 尾调用的概念非常简单 一句话就能说清楚 就是指某个函数的最后一步是调用另一个函数 function f x return g x 上面代码中 函数f的最后一步是调用函数g 这就叫尾调用 尾调
  • 每天10个前端小知识 <Day 5>

    前端面试基础知识题 1 typeof 与 instanceof 有什么区别 typeof与instanceof都是判断数据类型的方法 区别如下 typeof会返回一个变量的基本类型 instanceof返回的是一个布尔值 instanceo
  • 「网络安全渗透」如果你还不懂CSRF?这一篇让你彻底掌握

    1 什么是 CSRF 面试的时候的著名问题 谈一谈你对 CSRF 与 SSRF 区别的看法 这个问题 如果我们用非常通俗的语言讲的话 CSRF 更像是钓鱼的举动 是用户攻击用户的 而对于 SSRF 来说 是由服务器发出请求 用户 日 服务器
  • 【gee】下载modis土地利用类型

    var china ee FeatureCollection projects assets china boundary var lc dataset ee ImageCollection MODIS 061 MCD12Q1 filter
  • Vue3 和Vue2的区别,以及钩子函数的使用

    Vue js 3 和 Vue js 2 是两个主要版本的流行前端框架 它们之间有很多区别 包括性能优化 新特性和改进的API等 以下是一些Vue 3与Vue 2之间的主要区别 以及一些示例代码来说明这些差异 1 性能优化 响应式系统 Vue
  • 低代码-添加按钮组件设计

    效果图 可拆分为以下细节 按钮列表 删除 两个操作需同步删除 点击外侧删除 点击复选框删除 添加 点击复选框添加 示例代码 技术栈 vue3 arco design ts less tailwindcss
  • JVM优化之 -Xss -Xms -Xmx -Xmn 参数设置

    JVM优化之 Xss Xms Xmx Xmn 参数设置 XmnXmsXmxXss有什么区别 Xmn Xms Xmx Xss都是JVM对内存的配置参数 我们可以根据不同需要区修改这些参数 以达到运行程序的最好效果 Xms 堆内存的初始大小 默
  • 30天精通Nodejs--第十九天:express-文件上传下载

    目录 前言 环境准备与依赖安装 文件上传功能实现 引入并配置express fileupload中间件 注意事项 文件下载功能实现 结语 前言 文件的上传和下载是许多应用程序必备的功能 Node js的Express框架同样可以通过集
  • 智能 JVM 和 JIT 微优化

    随着时间的推移 Sun 的 JVM 和 JIT 已经变得相当智能 过去作为必要的微优化而成为常识的事情不再需要 因为它会为您处理好 例如 过去的情况是 您应该将所有可能的类标记为 Final 以便 JVM 内联尽可能多的代码 然而现在 JI
  • .NET 运行时 (CLR)、JIT 编译器到底位于哪里?

    这个问题可能看起来有点愚蠢或奇怪 但我听说过很多关于 NET CLR JIT 编译器及其工作原理的等等等等 但现在我想知道它到底位于或托管在哪里 Is it 当我们实际安装 NET Framework 时作为 Windows 操作系统的一部
  • 每天10个前端小知识 <Day 14>

    前端面试基础知识题 1 CSSOM树和DOM树是同时解析的吗 浏览器会下载HTML解析页面生成DOM树 遇到CSS标签就开始解析CSS 这个过程不会阻塞 但是如果遇到了JS脚本 此时假如CSSOM还没有构建完 需要等待CSSOM构建完 再去
  • 【前端】canvas图片加文字

    注释标记了操作步骤 import React Component createRef from react class CertifyImgRender extends Component bgRef createRef
  • 了解 C# 中运行时代码生成的各种选项(Roslyn、CodeDom、Linq 表达式,...?)

    我正在开发一个应用程序 我想在其中动态生成数值计算的代码 为了性能 作为数据驱动操作来执行此计算太慢 为了描述我的要求 请考虑此类 class Simulation Dictionary
  • 为什么即使运行了这么长时间也不会抛出断言错误?

    这是原始代码 author Brian Goetz and Tim Peierls ThreadSafe public class SafePoint GuardedBy this private int x y private SafeP
  • .NET 中预抖动程序集的优点和缺点是什么?

    NET 中预抖动程序集的优点和缺点是什么 我听说预抖动可以提高性能 什么时候应该预抖动 什么时候不应该预抖动 预编译 或预编译将提高性能 启动时 因为您将跳过该步骤 每次应用程序及其库加载时 NET JIT 的原因是 它可以在许多平台和架构
  • 如何检测 PHP JIT 是否启用

    检测 PHP 是否使用 JIT 编译并且从运行脚本启用 JIT 的最简单方法是什么 您可以通过调用直接查询opcache设置opcache get status https www php net manual en function op
  • PyPy 明显慢于 CPython

    我一直在测试我制作的缓存系统 其目的是加速 Django Web 应用程序 它将所有内容存储在内存中 根据 cProfile 我的测试中的大部分时间都花在 QuerySet clone 内 结果证明效率非常低 考虑到实现 这实际上并不奇怪

随机推荐

  • jenkins+newman+postman持续集成环境搭建

    目录 一 Newman简介 二 Newman应用 三 安装newman 四 Html报告插件安装 五 安装nodejs 六 Jenkins集成步骤 一 Newman简介 Newman是一款基于Node js开发的 可以运用postman工具
  • jQuery的scroll

    scrollTop垂直滚动 scrollLeft水平滚动 scrollTop 读取或设置滚动条的y坐标 代码示例如下
  • echarts修改柱状图的宽度

    echarts修改柱状图的宽度 series bar barWidth 自适应 numberstring 柱条的宽度 不设时自适应 可以是绝对值例如 40 或者百分数例如 60 百分数基于自动计算出的每一类目的宽度 在同一坐标系上 此属性会
  • Hx711称重模块+STM32+CubeMX

    文章目录 一 模块和接线 二 CubeMX配置 1 时钟及sys 2 IO口 1 数据线DT设置为Input 2 时钟线SCK设置为Output 3 串口 4 后续配置 三 程序 1 main c 2 hx711 c 3 hx711 h 4
  • R(N)

    http acm hdu edu cn showproblem php pid 3835 Problem Description We know that some positive integer x can be expressed a
  • vue 动态修改margin-top_详解 vue 组件三大核心概念

    给前端大全加星标 提升前端技能 作者 前端工匠 公号 浪里行舟 本文来自作者投稿 前言 本文主要介绍属性 事件和插槽这三个vue基础概念 使用方法及其容易被忽略的一些重要细节 如果你阅读别人写的组件 可以从这三个部分展开 它们可以帮助你快速
  • 区块链学习(1) sha256算法 c语言实现

    sha256算法 网上有很多的介绍 摘抄一段如下 SHA 256 算法输入报文的最大长度不超过2 64 bit 输入按512 bit 分组进行处理 产生的输出是一个256 bit 的报文摘要 该算法处理包括以下几步 STEP1 附加填充比特
  • Python学习笔记——多线程

    mtsleepA import thread from time import sleep ctime loops 4 2 def loop nloop nsec lock print start loop nloop at ctime s
  • Node.js mm131图片批量下载爬虫1.00 iconv协助转码

    mm131图片批量下载爬虫1 00 2017年11月15日 内置http模块 var http require http 内置文件处理模块 用于创建目录和图片文件 var fs require fs 用于转码 非Utf8的网页如gb2132
  • java反射详解

    本篇文章依旧采用小例子来说明 因为我始终觉的 案例驱动是最好的 要不然只看理论的话 看了也不懂 不过建议大家在看完文章之后 在回过头去看看理论 会有更好的理解 下面开始正文 案例1 通过一个对象获得完整的包名和类名 1 2 3 4 5
  • STM32学习——FATFS文件系统

    目录 什么是文件系统 常用的文件系统 FATFS的特点 FATFS层次结构 移植步骤 相关配置宏 FATFS文件系统移植实验 FATFS程序结构图 FATFS底层设备驱动函数 宏定义 设备状态获取 设备初始化 读取扇区 扇区写入 什么是文件
  • 代码质量检测工具 QAPLug

    代码质量检测工具 情景 写完代码一定要别人review才发现bug或不好的语法或多余的变量是一件多么尴尬的事情 如果想在写代码时或者写代码后自己能发现问题 那么代码QA工具无疑是你必备的工具 工具 QAPlug就是一款实用十分方便的代码质量
  • [游戏] chrome 的小彩蛋

    在电脑上不了网时 chrome 显示无法显示此网页的同时 还会有一个小游戏可以玩 用户可以操作空格键来控制一只小恐龙让它跳过灌木丛
  • Python 实现逐步回归

    常用评价指标简介 当前统计学以计算机科学作为支撑 机器于人工的优势是计算速度 但机器无法自行判断运算何时退出 因此需要定量指标作为运算退出的标志 对于预测类的统计模型来说 常见的指标有赤池信息准则 AIC 贝叶斯信息准则 BIC R方 RO
  • 冒泡排序、选择排序、插入排序 原理及Java代码实现

    1 冒泡排序 冒泡排序 Bubble Sort 是一种计算机科学领域的较简单的排序算法 冒泡排序算法的原理如下 1 比较相邻的元素 如果第一个比第二个大 就交换他们两个 2 对每一对相邻元素做同样的工作 从开始第一对到结尾的最后一对 在这一
  • Cpp学习——动态内存管理

    目录 一 new 1 malloc realloc calloc的使用不便之处 2 new的好处 3 opreator new 二 delete 1 为什么要有delete 2 为什么要匹配使用 一 new 1 malloc realloc
  • 【论文精读】NeRF详解

    最近阅读了开启三维重建新纪元的经典文章 NeRF Representing Scenes as Neural Radiance Fields for View Synthesis 接下来会 更新NeRF系列的论文精读 代码详解 力求做到全网
  • SpringBoot2.x 集成 Swagger3(springdoc-openapi)

    Swagger是一款RESTFUL接口的文档在线自动生成加功能测试的软件 提供描述 生产 消费和可视化RESTful Web Service Swagger也是一个api文档维护组织 后来成为了OpenAPI 一个业界的api文档标准 标准
  • 赛联区块链培训课程介绍

    基础版
  • 谷歌V8引擎运行机制概览

    最近学习了极客时间上李兵大佬的谷歌V8引擎课程 总结了一下 在公司内部小组分享了一波 在此也分享一下 原理图直接用的专栏的图 由于时间有限 总结略显粗糙 注 解释执行 编译执行各有优缺点 解释执行 不需要做过多的编译 所以启动快 执行时不时