跳到主要内容

11 篇博文 含有标签「内部结构」

查看所有标签

陆地在望:离开节点海洋

· 阅读需 29 分钟
Darius Mercadier

V8的最终优化编译器Turbofan以使用节点海洋 (SoN)而闻名,这是少数几个在生产环境中使用的大规模编译器之一。然而,从大约三年前开始,我们逐步放弃节点海洋,采用一种更传统的控制流图 (CFG) 中间表示 (IR),我们将其命名为Turboshaft。目前,Turbofan的整个JavaScript后端已经改用Turboshaft,而WebAssembly的整个管道也采用了Turboshaft。Turbofan的两个部分仍然使用一些节点海洋:一个是内置管道,我们正在慢慢被Turboshaft替换;另一个是JavaScript管道的前端,我们正在用另一个基于控制流图的IR(Maglev)代替。本文将阐述我们为何离开节点海洋的原因。

更快的JavaScript调用

· 阅读需 20 分钟
[Victor Gomes](https://twitter.com/VictorBFG),框架破碎者

JavaScript允许以与预期参数数量不同的参数数量调用函数,也就是说,可以传递比声明的形式参数少或多的参数。前者称为“少应用(under-application)”,后者称为“多应用(over-application)”。

V8中的指针压缩

· 阅读需 22 分钟
Igor Sheludko 和 Santiago Aboy Solanes,*指针压缩专家*

在内存和性能之间总是存在不断的斗争。作为用户,我们希望既能快速又尽量少地使用内存。不幸的是,通常提升性能会带来内存消耗的代价(反之亦然)。

更轻量的 V8

· 阅读需 12 分钟
Mythri Alle、Dan Elphick 和 [Ross McIlroy](https://twitter.com/rossmcilroy),V8 内存优化团队

2018 年末,我们启动了一个名为 V8 Lite 的项目,旨在显著减少 V8 的内存使用量。起初,这个项目被设想为 V8 的一种独立的 轻量模式,专门针对低内存移动设备或更注重内存使用而非吞吐执行速度的嵌入场景。然而,在进行这项工作时,我们发现许多针对这个 轻量模式 的内存优化可以迁移到常规 V8,从而让所有 V8 的用户受益。

无即时编译的 V8

· 阅读需 4 分钟
Jakob Gruber ([@schuay](https://twitter.com/schuay))

V8 v7.4 现在支持在运行时不分配可执行内存的情况下执行 JavaScript。

在默认配置中,V8 强烈依赖运行时分配和修改可执行内存的能力。例如,TurboFan 优化编译器会即时为热点 JavaScript (JS) 函数生成本机代码,而大多数 JS 正则表达式是通过 irregexp 引擎 编译成本机代码的。在运行时创建可执行内存是使 V8 快速的重要原因之一。

V8中的并发标记

· 阅读需 13 分钟
Ulan Degenbaev, Michael Lippautz 和 Hannes Payer — 主线程解放者

这篇文章描述了一种叫做_并发标记_的垃圾回收技术。这项优化使 JavaScript 应用程序在垃圾回收器扫描堆以发现并标记活动对象时可以继续执行。我们的基准测试表明,并发标记将主线程上标记所需的时间减少了60%-70%。并发标记是 Orinoco 项目 的最后一块拼图 — 这是一个逐步用新的大多数并发和并行垃圾回收器替换旧垃圾回收器的项目。并发标记在 Chrome 64 和 Node.js v10 中默认启用。

启动 Ignition 解释器

· 阅读需 4 分钟
Ross McIlroy, V8 Ignition 初学者

V8 和其他现代 JavaScript 引擎通过 即时(JIT)编译 将脚本转换为本机机器代码以获得执行速度,而这通常是在执行前立即进行的。代码最初由基础编译器快速生成非优化的机器代码,在运行时进行分析,并根据需要动态使用更高级的优化编译器进行重编译以实现更优性能。在 V8 中,这种脚本执行管道包含各种特殊情况和条件,因而需要复杂的机制在基础编译器和两个优化编译器 Crankshaft 与 TurboFan 之间切换。

V8扩展功能

· 阅读需 6 分钟
Domenic Denicola ([@domenic](https://twitter.com/domenic)), 流处理大师

V8在JavaScript本身中实现了JavaScript语言内置对象和函数的大部分子集。例如,您可以看到我们的Promise实现是用JavaScript编写的。这类内置对象称为_基于自身的_。这些实现包含在我们启动快照中,因此可以快速创建新上下文,而无需在运行时设置和初始化基于自身的内置对象。

自定义启动快照

· 阅读需 3 分钟
杨国([@hashseed](https://twitter.com/hashseed)),软件工程师和引擎预热供应商

JavaScript 规范中包含了许多内置功能,从数学函数到一个功能齐全的正则表达式引擎。每个新创建的 V8 上下文从一开始就可以使用这些功能。为了实现这一点,全局对象(例如浏览器中的 window 对象)和所有内置功能必须在创建上下文时设置并初始化到 V8 的堆中。从头开始执行这些操作需要相当多的时间。