V8 过去版本的性能提升汇总

news2024/11/16 19:43:05
(预测未来最好的方法就是把它创造出来——尼葛洛庞帝)

在这里插入图片描述

V8

官方链接
NodeJs8.3之前的代码优化建议
NodeJs8.3版本之后的turbofan虚拟机引擎
编写性能更高的JavaScript代码
chromium 优化博客
chrom v8版本发布路线图
V8 是 Google 的开源高性能 JavaScript 和 WebAssembly 引擎,用 C++ 编写。它用于 Chrome 和 Node.js 等。它实现了ECMAScript和WebAssembly,并运行在 Windows 7 或更高版本、macOS 10.12+ 和使用 x64、IA-32、ARM 或 MIPS 处理器的 Linux 系统上。V8 可以独立运行,也可以嵌入到任何 C++ 应用程序中。

接下来整理的主要是nodejs后端业务常涉及到的更新,其他更新不会记录或记录的不详细。更详细的,请直接查看官网。在此记录的只方便后期回顾。

9.3

2021 年 8 月 9 日发布

Sparkplug编译器

在了解Sparkplug之前,我们先简单了解v8编译器的历史,分为三个部分

CrankShaft

早期的v8在将代码解析成语法树后直接全部编译为机器码来执行。对于执行次数较多的代码会编译成经过优化的汇编代码。正常访问对象属性的过程是:首先获取隐藏类的地址,然后根据属性名查找偏移值,然后计算该属性的地址。但经过多次执行代码,会通过隐藏类和内联缓存等方式加载访问对象的速度从而提升性能。

TurboFan

但在2016年,有人发现重复关闭打开facebook时,v8打开速度反而越来越慢。这说明v8对浏览器缓存内容的处理依然存在问题。可是也不能将所有代码都进行缓存,这样占用的内存空间又太大了,所以之前的优化方式是只解析声明部分,执行部分在用到的时候再进行解析。有一些初始化类的递归函数会导致执行速度变慢。直接全部编译成机器码也会造成启动速度过慢。CrankShaft虽然能做缓存,但也是从源代码进行解析,就造成了重复解析的问题。CrankShaft无法对部分代码进行优化,比如trycatch,finally等。
基于这些主要的原因,V8团队做了以下优化

  • 不再全部编译为机器码,而是由Ignition解释器将语法树转换成字节码。这样就大量节省了内存孔间
  • 热点代码由TurboFan编辑器直接从字节码编译成经过优化后的汇编代码,并且能对trycatch,finally等代码进行优化
Sparkplug

相关视频
上一个版本依然存在一些问题,比如非热点函数,每次都要从源代码转换成字节码再转换成汇编代码。那么Sparkplug为了解决这个问题,将所有代码都直接转成非热点的汇编代码,如果多次执行,则再从字节码转换为经过优化后的汇编代码以提高性能。

9.0

2021 年 3 月 17 日发布

更快的super访问

更详细的解释
访问super属性(例如,super.x)已通过使用 V8 的内联缓存系统和 TurboFan 中的优化代码生成进行了优化。通过这些更改,super属性访问现在更接近于常规属性访问,如下图所示。
在这里插入图片描述
比如有以下代码

class A { }
A.prototype.x = 100;

class B extends A {
  m() {
    return super.x;
  }
}
const b = new B();
b.m();

然后我们分析b的原型链。而实际上b.m()的查找过程也是此原型链进行查找。这也是此次性能优化的主要依据。

b ->
 b.__proto__ === B.prototype ->
  B.prototype.__proto__ === A.prototype ->
   A.prototype.__proto__ === Object.prototype ->
    Object.prototype.__proto__ === null

在此之前每次使用super进行属性或者方法的查找都是基于原型链,那么现在,对于热点(经常被调用)的属性或者方法v8会生成缓存,不再依赖原型链,而是直接通过缓存进行查找,性能更佳。

8.9

2021 年 2 月 4 日发布

参数大小不匹配的更快调用

JavaScript 允许使用与预期参数数量不同的参数调用函数,即可以传递比声明的形式参数更少或更多的参数。前者称为应用不足,后者称为应用过度。

在应用程序不足的情况下,其余参数将分配给该undefined值。在过度应用的情况下,剩余的参数可以通过使用 rest 参数和属性来访问Function.prototype.arguments,或者它们只是多余的并被忽略。现在许多 Web 和 Node.js 框架都使用此 JS 功能来接受可选参数并创建更灵活的 API。

直到最近,V8 才有一个特殊的机制来处理参数大小不匹配:参数适配器框架。不幸的是,参数适配是以性能为代价的,并且在现代前端和中间件框架中通常需要。事实证明,通过巧妙的设计(比如颠倒堆栈中参数的顺序),我们可以删除这个额外的框架,简化 V8 代码库,并几乎完全消除开销。

console.time();
function f(x, y, z) {}
for (let i = 0; i <  N; i++) {
  f(1, 2, 3, 4, 5);
}
console.timeEnd();

8.6

2020 年 9 月 21 日发布

Number.prototype.toString提升性能

在一般情况下,将 JavaScript 数字转换为字符串可能会非常复杂,必须考虑浮点精度、科学计数法、NaN、无穷大、舍入等。在计算之前,甚至不知道结果字符串的大小。因此,V8 对 Number.prototype.toString 的实现将提供给 C++ 运行时函数。

但很多时候,你可能只想打印一个简单的小整数(“Smi”)。这是一个简单得多的操作,不再需要调用 C++ 运行时函数的开销。因此,V8 团队为使用 Torque 编写的 Number.prototype.toString 添加了一个小整数的简单快速路径,以减少这种常见情况的开销。

8.3

2020 年 5 月 4 日发布

ArrayBuffer垃圾收集器中的更快的回收

ArrayBufferV8 v8.3 有一个新的跟踪ArrayBuffers 及其后备存储的机制,允许垃圾收集器迭代并释放后备存储并发给应用程序

8.0

2019 年 12 月 18 日发布

指针压缩

指针压缩用于在V8和Oilpan(DOM 对象的垃圾收集器)中节省内存。我们对压缩和解压缩指针的方式进行了优化,并避免压缩高流量字段。考虑到这些操作的执行频率,它会对性能产生广泛的影响。我们还将经常访问的对象(如 JavaScript 的“undefined”)移动到内存基址的开头,从而允许使用更快的机器代码访问它们。
改进的功能和高效的指针压缩共同使我们在三个月内将Apple 的Speedometer 2.1 浏览器基准测试提高了 10% 。
在这里插入图片描述

优化高阶内置函数

删除了 TurboFan 优化管道中的一个限制,该限制阻止了对高阶内置函数的积极优化。

const charCodeAt = Function.prototype.call.bind(String.prototype.charCodeAt);

charCodeAt(string, 8);

到目前为止,对 TurboFan 的调用charCodeAt是完全不透明的,这导致生成对用户定义函数的通用调用。有了这个变化,我们现在能够认识到我们实际上是在调用内置String.prototype.charCodeAt函数,因此能够触发 TurboFan 现有的所有进一步优化以改进对内置函数的调用,从而获得与以下相同的性能

string.charCodeAt(8);

此更改会影响许多其他内置函数,例如Function.prototype.apply、Reflect.apply和许多高阶数组内置函数(例如Array.prototype.map)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/509720.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

unity 实现水的波纹效果

之前的实现过这个效果&#xff0c;可惜没有记笔记&#xff0c;所以现在有点遗忘&#xff0c;连多个波纹一起在水面上实现的效果都忘记了&#xff0c;所以&#xff0c;查看了下之前实现的代码&#xff0c;现在再记一下笔记。 基础的波纹效果 要实现波纹&#xff0c;首先要知道…

技术转管理,先来试试管理好项目

今天分享的主题是&#xff1a;如果你想技术转管理&#xff0c;先来试试管好一个项目 技术转管理&#xff0c;是很多技术人员的梦想&#xff0c;这也是30多岁之前还在做技术的人&#xff0c;也会对自己常常发出居安思危的意识表现&#xff0c;所以经常有人问我&#xff0c;怎么样…

chatGPT润色中英论文软件-文章修改润色器

chatGPT可以润色英文论文吗&#xff1f; ChatGPT可以润色英文论文&#xff0c;它具备自动纠错、自动完善语法和严格全面的语法、句法和内容结构检查等功能&#xff0c;可以对英文论文进行高质量的润色和优化。此外&#xff0c;ChatGPT还支持学术翻译润色、查重及语言改写等服务…

Java每日一练(20230510) 生成器类、螺旋矩阵II、删除链表的重复元素II

目录 1. 定义一个类Generator &#x1f31f;&#x1f31f; 2. 螺旋矩阵 II &#x1f31f;&#x1f31f; 3. 删除排序链表中的重复元素 II &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日…

Linux 设备树

1 什么是设备树&#xff1f; 设备树(Device Tree)&#xff0c;将这个词分开就是“设备”和“树”&#xff0c;描述设备树的文件叫做 DTS(Device Tree Source)&#xff0c;这个 DTS 文件采用树形结构描述板级设备&#xff0c;也就是开发板上的设备信息&#xff0c;比如 CPU 数量…

【Proteus仿真】| 05——问题记录

系列文章目录 【Proteus仿真】| 01——软件安装 【Proteus仿真】| 02——基础使用 【Proteus仿真】| 03——超详细使用教程 【Proteus仿真】| 04——绘制原理图模板 【Proteus仿真】| 05——问题记录 文章目录 前言1、51单片机仿真2、stm32仿真1. stm32 adc 采集电压一直为0 3、…

显卡3080设备CentOS 7.9 环境安装最新anconda、tensorflow-gpu 、cudatoolkit、cudnn、 python

目标&#xff1a;使用3080显卡搭建环境 系统安装 显卡驱动安装&#xff1a; 安装anconda 安装 python 安装 :cuda 安装&#xff1a;cudnn 安装 :tensorflow 一&#xff1a;系统安装&#xff1a;详见历史文档 二&#xff1a;显卡驱动安装&#xff1a;详见历史 三&#xff1a;整…

安装2023最新版_华为欧拉操作系统_OpenEuler操作系统_并配置IP地址_联网---linux工作笔记055

强调,一定要记得,硬盘多给点,50G根本不够用,搭建集群的话,自己测试都要100G才行哈.. 要不然麻烦,因为别的可以动态修改,但是硬盘大小修改了,不起作用,需要在 linux中再设置分区很麻烦 https://www.openeuler.org/zh/download/ 首先去下载安装包 然后找到这个安装包下载 然…

虚拟机中linux操作系统如何连网

文章目录 方法镜像来源本文前提创建centos7虚拟机1. 创建新的虚拟机&#xff0c;选择典型配置2. 安装来源选择上述下载的centos3. 命名虚拟机时注意事项如下图所示4. 后面配置硬盘大小默认20GB足以&#xff0c;然后调整虚拟机设置&#xff0c;可参考下图5.运行虚拟机 实操建议 …

混频器IP3的测量以及测试误差的来源分析

混频器线性度一直是射频系统设计面临的一个关键问题。混频器的非线性会产生不需要的、不可滤的杂散、互调和非线性失真。例如&#xff0c;非线性混频可能导致不希望的杂散&#xff0c;例如2fRF✕2fLO 或2fRF✕fLO 频率分量&#xff0c;加剧射频系统频谱再生问题。 1、IP3和IMD…

工具接口调用报错:“error“: “Unsupported Media Type“

工具接口调用报错&#xff1a;"error": "Unsupported Media Type" 问题原因&#xff1a; Media Type&#xff0c;即是Internet Media Type&#xff0c;互联网媒体类型&#xff0c;也叫做MIME类型&#xff0c;在Http协议消息头中&#xff0c;使用Content-T…

安全成就未来|Fortinet Accelerate 2023·中国区巡展首站启幕

Fortinet Accelerate 2023中国区巡展 年度网络安全盛会 Fortinet Accelerate 2023中国区巡展&#xff0c;昨日在深圳拉开帷幕&#xff0c;开启15城巡展的“首城之站”。本年度巡展主题“安全成就未来”&#xff0c;Fortinet与中企通信、亚马逊云科技等生态合作伙伴&#xff0c…

【动态代理】JDK动态代理与cglib动态代理源码解析

JDK动态代理 demo展示 UserService&#xff0c;接口类 public interface UserService {void addUser(); }UserServiceImpl&#xff0c;实现类 public class UserServiceImpl implements UserService {Overridepublic void addUser() {System.out.println("register al…

【运动规划算法项目实战】如何实现Dubins曲线和Reeds-Shepp曲线(附ROS C++代码)

文章目录 前言一、Dubins曲线二、Reeds-Shepp曲线三、应用场景四、代码实现4.1 Dubins曲线实现4.2 Reeds-Shepp曲线实现4.3 RVIZ显示五、总结前言 Dubins曲线和Reeds-Shepp曲线在机器人、自动驾驶行业中是非常重要的路径规划算法,它们能够有效地在不同的场景中生成最短路径,…

zlmediakit 新增可以使用硬件加速的转码http api接口方法

根据项目需求&#xff0c;我们需要使用硬件解码的方式进行网络摄像头数据帧的解析&#xff0c;给到算法模块使用 1、通过ffmpeg命令实验&#xff0c;ffmpeg -i IPC_URL -f rtsp rtsp://*/live 该命令默认是使用cpu进行解码的&#xff0c;我们需要使用GPU进行解码。 2、ffmpe…

皮特测评:蓝牙耳机哪个品牌最好?300元内最好的蓝牙耳机

大家好&#xff0c;我是皮特&#xff0c;今天要发布的测评主题是&#xff1a;“蓝牙耳机哪个品牌最好&#xff1f;”粉丝们私信给我希望能分享一期平价好用的蓝牙耳机&#xff0c;我购入十多款蓝牙耳机进行了多角度的测评后&#xff0c;总结了五款表现最优秀的蓝牙耳机&#xf…

神仙级python入门教程(非常详细),从零基础入门到精通,从看这篇开始

一.初聊Python 1.为什么要学习Python&#xff1f; 在学习Python之前&#xff0c;你不要担心自己没基础或“脑子笨”&#xff0c;我始终认为&#xff0c;只要你想学并为之努力&#xff0c;就能学好&#xff0c;就能用Python去做很多事情。在这个喧嚣的时代&#xff0c;很多技术…

前端开发之Echarts 图表渐变两种实现方式和动态改变图表类型

前端开发之Echarts 图表渐变两种实现方式 前言效果图一、echarts中存在两种渐变方式1、color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{}&#xff0c;{}&#xff0c;{}])简单案例 2、{type: linear,x: 0,y: 0,x2: 0,y2: 1, [{}&#xff0c;{}&#xff0c;{}]}案例 二…

硬件通信之 从单片机到C/C++指针详解

一 单片机理论概述 1.1 单片微型计算机&#xff08;Single Chip Microcomputer&#xff09;简称单片机&#xff0c;是把组成微型计算机的主要功能部件&#xff08;CPU、RAM、ROM、I/O口、定时/计数器、串行口等&#xff09;集成在一块芯片中&#xff0c;构成一个完整的微型计…

centos7安装nginx

1.配置环境 1).gcc yum install -y gcc2).安装第三方库 pcre-devel yum install -y pcre pcre-devel3).安装第三方库 zlib yum install -y zlib zlib-devel2.下载安装包并解压 nginx官网下载&#xff1a;http://nginx.org/en/download.html 或者 使用wget命令进行下载 wg…