编译器:swc 究竟比 babel 快在哪里?

前言

swc 与 babel 都是 JavaScript 编译器,它们的主要功能是将 ES2015+ 以及 TypeScript, Flow, JSX 等语法转换为浏览器或环境中的向后兼容的 JavaScript 代码。

哪里快了?

1. 开发语言的优势

swc 是用 Rust 语言开发的,而 babel 是用 JavaScript 语言开发的。这意味着 swc 可以利用 Rust 的性能优势,如无 GC(垃圾回收机制)、系统级语言、多核 CPU 支持等,而 babel 则受限于 JavaScript 的性能问题,如 GC、单线程等。

2. AST 树透传

swc 在编译代码时并不需要将 AST 树透传下去,而是直接在内存中进行转换。这样可以避免多次遍历 AST 树,提高编译效率。而 babel 则需要将 AST 树传递给每一个插件,这样会增加编译时间和内存消耗

3. 编译后的代码更快

swc 可以将 JavaScript 代码编译为 WebAssembly,这样可以提高代码的执行速度。而 babel 则只能编译为 JavaScript 代码,无法利用 WebAssembly 的优势。

总结

  • swc 相比于 babel 的优势主要是编译速度和执行速度方面,根据官方测试,swc 有至少 10 倍以上的性能优势。但是 babel 的优势主要是插件系统和生态方面,babel 有更多的插件和框架支持,可以处理更复杂的 JavaScript 项目。
  • 目前,swc 已经被 Next.js 等前端框架采用,未来有望在前端工程化领域发挥更大的作用。而 babel 仍然是目前最流行的 JavaScript 编译器,被 Vue, React, Angular 等框架广泛使用。

/-------------------------------------------------- 扩展知识 ------------------------------------------------------/

Rust 无 GC 的原因?

它使用了一种叫做所有权的机制来管理内存

  • 所有权的基本思想:每个值都有一个唯一的所有者,当所有者离开作用域时,值就会被自动释放。这样就避免了内存泄漏和悬垂指针的问题,也不需要运行时的垃圾回收器来跟踪和清理内存。

Rust 还引入了借用和生命周期的概念,来控制对值的访问和修改。借用就是临时使用一个值的引用,而不是拥有它。生命周期就是一个值或者一个引用在程序中存在的时间段。Rust 编译器会检查借用和生命周期是否符合一些规则,来保证内存安全和数据一致性。

Rust 的这种内存管理方式,既可以保证程序的正确性,又可以提高程序的性能,因为它不需要额外的内存开销和垃圾回收的暂停。这也是 Rust 被称为“零成本抽象”的原因之一。

系统级语言

系统级语言是指那些可以直接操作硬件和底层系统的编程语言

它们通常具有以下特点:

  • 语法简洁,指令集小,编译速度快,运行效率高
  • 支持指针和内存管理,可以访问和修改内存地址和寄存器
  • 支持汇编语言的嵌入和调用,可以实现与硬件的交互
  • 支持多种数据类型和结构,可以表示和处理复杂的数据
  • 支持静态编译和链接,可以生成可执行的二进制文件,不需要运行时环境

系统级语言的代表有 C, C++, Rust, Go 等,它们被广泛用于开发操作系统,驱动程序,嵌入式系统,游戏引擎等领域。系统级语言的优势是性能高,控制力强,可移植性好,但是也有一些缺点,如语法复杂,调试困难,内存安全难以保证等。

WebAssembly

WebAssembly 是一种开放的网络标准,由 W3C WebAssembly Community Group 开发,并得到了主要浏览器厂商的支持。目前,WebAssembly 已经被一些前端框架和工具采用,如 Next.js, Astro, SvelteKit, Blazor, Emscripten 等。

  • 一种低级的类汇编语言 可以在现代网络浏览器中运行,具有紧凑的二进制格式,可以接近原生的性能运行,并为诸如 C, C++ 和 Rust 等语言提供一个编译目标,以便它们可以在 Web 上运行。它也被设计为可以与 JavaScript 共存,允许两者一起工作。

  • 快速、高效、可移植和安全 它可以解决一些 JavaScript 在性能方面的问题,特别是对于 3D 游戏、虚拟现实、增强现实、计算机视觉、图像/视频编辑等领域的应用。WebAssembly 的模块可以被导入到一个网络应用中,并且暴露出供 JavaScript 使用的函数,JavaScript 也可以把函数导入到 WebAssembly 模块中,实现双向的互操作。

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

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

相关文章

MS5228/5248/5268:2.7V 到 5.5V、 12/14/16Bit、内置基准、八通道数模转换器

MS5228/MS5248/MS5268 是一款 12/14/16bit 八通道输出的电压型 DAC ,内部集成上电复位电路、可选内部基准、接口采用四线串口模式, 最高工作频率可以到 40MHz ,可以兼容 SPI 、 QSPI 、 DSP 接口和 Microwire 串口。输出接到一个 …

IP地址/16或者/24的意义

IP地址/16或者/24的意义 2023-04-26 16:54 猎手家园 阅读(533) 评论(0) 编辑 收藏 举报 当创建VPC专有网络时,许多人会遇到填写IPv4地址的情况,通常使用的格式是xxx.xxx.xxx.xxx/16或者xxx.xxx.xxx.xxx/24。那么这个斜杠后面的数字代表什么意思呢&#…

<习题集><LeetCode><链表><2/19/21/23/24>

目录 2. 两数相加 19. 删除链表的倒数第 N 个结点 21. 合并两个有序链表 23. 合并 K 个升序链表 24. 两两交换链表中的节点 2. 两数相加 https://leetcode.cn/problems/add-two-numbers/ public ListNode addTwoNumbers(ListNode l1, ListNode l2) {//head是cur链表头节点…

pdf转png的两种方法

背景:pdf在一般公司,没有办公系统,又不是word/wps/Office系统,读不出来,识别不了,只能将其转化为图片png,因此在小公司或者一般公司就需要pdf转png的功能。本文将详细展开。 1、fitz库(也就是PyMuPDF) 直接pip安装PyMuPDF即可使用,直接使用fitz操作,无需其他库。 …

Go语言实现深度学习的正向传播和反向传播

文章目录 开发前言开发理论图解理论数据类型数学函数数据节点统一抽象变量数据节点常量数据节点单目运算封装双目运算封装算子节点统一抽象基础算子加法算子减法算子乘法算子除法算子指数算子对数算子正切算子正弦算子余弦算子数据流图正向传播反向传播正向训练反向训练运行示例…

我的记事本

url uniform resource locator. 统一资源定位符 请求状态码 1XX:信息响应 2XX:成功响应 3XX:重定向消息 4XX:客户端错误响应 5XX:服务器端错误响应 IP地址分类 本机回环IP地址:127.0.0.1 ~ 127.255.255.254 局域网IP(私网IP) 192.168.0.0 &am…

船舶机电设备振动数据采集监控系统解决方案

船舶运行中,通常需要通过振动数据采集系统对船舶的各个机电设备运行进行监控,有助于在设备故障时快速预警,进行诊断、分析和维护,保证船舶机电设备正常工作,从而确保工作人员及船舶的安全。 船舶各种机电设备会产生大…

vLLM介绍

简介 vLLM 工程github地址 Paged attention论文地址 vLLM开发者介绍 Woosuk Kwon vLLM: A high-throughput and memory-efficient inference and serving engine for LLMs. SkyPilot: A framework for easily and cost effectively running machine learning workloads on …

【模型量化】神经网络量化基础及代码学习总结

1 量化的介绍 量化是减少神经网络计算时间和能耗的最有效的方法之一。在神经网络量化中,权重和激活张量存储在比训练时通常使用的16-bit或32-bit更低的比特精度。当从32-bit降低到8-bit,存储张量的内存开销减少了4倍,矩阵乘法的计算成本则二…

ALNS算法中随机化重要性的评价

文章概述 本研究分析了在海上提货和交付问题中使用的ALNS元启发式算法中的随机化成分。研究者提出了简单的确定性替代方案,并通过实验比较了随机化和确定性成分的性能。结果表明,初始实现的简单确定性替代方案能够与随机化成分的性能相匹配。这项研究为…

IDEA使用git从远程仓库获取项目

将地址填入url中 然后直接clone就行

《Easy3d+Qt+VTK》学习

《Easy3dQtVTK》学习-1、编译与配置 一、编译二、配置注 一、编译 1、 资源下载:easy3d giuhub 2、解压缩 3、用qt打开CMakeLists.txt即可 4、点击项目,选择debug或者release,图中3处可自行选择,因为我的qt版本是6&#xff0c…

Java集合大总结——Collections工具类

简单阐述 参考操作数组的工具类:Arrays,Collections 是一个操作 Set、List 和 Map 等集合的工具类。 常用方法 Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现…

jdbc4.MySQLSyntaxErrorException: Query was empty

出现这种异常的原因,有几个要点 检查sql语句是否正确检查你的条件是否真的被sql使用 背景 delete sql在xml中,赋值list对象,计划进行批量删除的sql,这时出现了异常,检查后,发现这个list竟然是空&#xff…

Linux下的软硬链接

Linux下的软硬链接 Linux下的硬链接和软链接是一种文件系统级别的链接方式,它们允许你在不同的目录中创建指向同一个文件的引用。硬链接和软链接的主要区别在于它们的实现方式和删除方式。 硬链接(Hard Link): 硬链接是指向同一…

在linux上如何运用虚拟数据优化器VDO

本章主要介绍虚拟化数据优化器。 什么是虚拟数据优化器VDO 创建VDO设备以节约硬盘空间 16.1 了解什么是VDO VDO全称是Virtual Data Optimize(虚拟数据优化),主要是为了节省硬盘空间。 现在假设有两个文件file1和 file2,大小都是10G。file…

cpu 300% 爆满 内存占用不高 排查

top查询 cpu最高的PID ps -ef | grep PID 查看具体哪一个jar服务 jstack -l PID > ./jstack.log 下载/打印进程的线程栈信息 可以加信息简单分析 或进一步 查看堆内存使用情况 jmap -heap Java进程id jstack.log 信息示例 Full thread dump Java HotSpot(TM) 64-Bit Se…

横向扩展统一存储与备份服务器功能

Infortrend 更新了GS,GSe,GSe Pro统一存储系列的备份服务器功能。该功能降低数据备份成本,并提供灵活的备份策略。通过备份服务器功能,用户可以通过多种途径实现数据备份,包括公有云(兼容S3)、文…

为内核新增字符驱动模块

1. 放置代码 在./source/driver/char下放置模块文件夹 2. Makefile和Kconfig makefile文件参考 obj-$(AAA_LED) AAA-led.oKconfig文件参考 config AAA_LEDtristate "Phytium macb led control module"depends on XXXdefault mhelpIf you have a n…

C/C++,树算法——二叉树的插入(Insert)算法之源程序

1 文本格式 #include<iostream> using namespace std; // A BTree node class BTreeNode { int* keys; // An array of keys int t; // Minimum degree (defines the range for number of keys) BTreeNode** C; // An array of child pointers int …