TypeScript 语言在不改变算法复杂度前提下,细节上性能优化,运行时性能提升效果明显吗?

news2024/11/15 19:54:15

有经验的专家写的代码,和无经验的新手写的代码,在运行时性能上大概会有多少差异?
个人感觉,常规业务逻辑代码通常可以差 1 倍;如果算上框架的影响,可以差 2~4 倍。

仅考虑业务代码的话,新手容易搞不清楚 Control Flow 进而绕了一大圈去完成原本可以直接完成的事情。我在优化或者重构过程中需要花费很大的精力去梳理原先的 Control Flow,这部分优化已经可以带来将近成倍的提升,例如:

  • 将串行网络请求修改为并行
  • 添加一些缓存(如 React.memo
  • 把会导致 UI 重渲染的代码整合在一起,做批处理

细化到核心算法层面,我的思路是:算法剪枝 + 围绕引擎的优化(主要是 V8)。剪枝就得根据具体算法来看了,剪得好也能得到将近成倍的提升,也不属于本问讨论范围。

以各位专家(我不是)的经验,这种编译器最多可以提升多少% 运行时性能?可以推荐一下该款编译器的主要优化方向吗?

围绕引擎的优化我认为是有可以做的空间的。例如:

  • Map<string, T> 重构为 Record<string, T | undefined>,读取速度可以快 30% 左右,修改删除速度不清楚
  • forEach(fn) 重构为 for (let i = 0; i < arr.length; i++) 循环自身开销可以减少 20% 左右
  • function foo(...args: T[]) 重构为 function foo(args: T[]),可变参数改固定参数,会有一定的提升
  • class 属性 [[Define]] 语义改为 [[Assignment]] 语义,现有情况下可以提升 50% 左右的实例化性能
  • class 中 foo?: T 重构为 foo: T | undefined,提前初始化所有属性(即使是没用到的属性,也初始化为 undefined)会有一些函数字节码缓存相关的调用性能提升 [1]
  • 为了传参创建一次性对象,改为固定使用一个对象不断改变其值,可以减少 GC 稳帧率
  • 强制整型运算,例如 1 + 1 重构为 (1 | 0) + (1 | 0)
  • ……肯定还有很多我不知道的

注:以上数字偷个懒没考证,可以再用 https://jsbench.me/ 跑一下

值得一提的是,若干年前,emscripten 和 asm.js 应该使用了非常多的奇技淫巧,来把 C++ 代码变成高性能的 JS 代码,到现在应该都还有参考价值。

但是按我的经验来看,业务代码可能绝大多数都是 IO 密集型的,引擎级别的优化能让业务代码提升多少,真的不好回答。如果是计算密集型的库代码,综合提升 10%~20% 应该是有希望的。

说完了可能的方向,我来说一个我认为通过编译器优化 TS 代码的一些潜在困难

  1. 大部分 JS 开发者没有类型意识,甚至有一小部分开发者认为类型是写代码过程中的累赘。由此产生的问题有:代码中经常出现 any 或者跟 any 极为相似的类型,相当于是完全关闭了类型系统,难以优化;空值问题显著,例如很多开发者并不知道 foo?: Tfoo: T | undefinedfoo: T | nullfoo: T | null | undefined 到底有什么区别。
  2. TS 无任何运行时束缚,而且 TS 就是这么设计的。因此,万一编译器把类型搞错了,不会有任何提示,只会有线上 Bug。
  3. TS 在一些情况下 unsound,这是为了妥协 JS 社区中一些常见用法而设计的,降低了类型系统的门槛,但可能对编译器不友好。

当然相信在巨佬的努力下是可以解决这些难题的~

最后夹带一个性能优化万金油,没试过的甚至可能直接完成你下半年的性能优化 OKR

在项目中用了各种转码器(babel、esbuild、swc)的同学,转码器虽好,但他们都是有性能代价的。把向下兼容的版本调的越低,兼容代码给业务代码带来的性能负担就会越重,包括运行效率和包体积。

用 babel-preset-env 的,开启 loose 选项,整个项目可以加速 10%~30%。如果写的是库,可以配合 esbuild/swc + buble(不是 typo,真的叫 buble,但已经不维护了,慎用),几乎可以做到 0 编译开销。

Reference
[1] https://stackoverflow.com/questions/44466931/is-it-an-optimization-to-explicitly-initialize-undefined-object-members-in-javas

image.png

image.png

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

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

相关文章

Python3 使用 pymssql 连接 SQL Server 报错:DB-Lib error message 20002, severity 9

一、版本说明 python版本&#xff1a; 3.12.1 pymssql版本&#xff1a; 2.3.0 # pymssql.version_info() SQL Server版本&#xff1a;SQL Server 2008 OS版本&#xff1a; rocky linux 9.4二、报错信息 Traceback (most recent call last):File "src/pymssql/_…

四大运营商大流量卡测评,手机卡,物联网卡,纯流量卡

买大流量卡&#xff0c;看4个方面 优惠时间。有的只是12个月&#xff0c;24个月有优惠【可以先用一年&#xff0c;然后注销】通用流量。而不是定向流量全国通话分钟数。而不是亲情通话分钟数销户方式。是否支持随时销户&#xff0c;异地销户&#xff0c;线上销户&#xff0c;额…

【云原生】kubernetes中的认证、权限设置---RBAC授权原理分析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

【云擎未来,智信天下】移动云服务器Docker部署+远程连接Redis

文章目录 引言&#xff1a; 移动云&#xff1a;云擎未来&#xff0c;智信天下一、什么是Redis&#xff1f;二、Redis 与其他 key-value 存储有什么不同&#xff1f;Redis 架构 三、环境准备四、部署流程使用Redis Desktop Manager远程连接操作数据库总结与未来展望云擎未来&…

Matlab进阶绘图第57期—带填充纹理的横向柱状图

带填充纹理的横向柱状图是通过在原始横向柱状图的基础上添加不同的纹理得到的&#xff0c;可以很好地解决由于颜色区分不足而导致的对象识别困难问题。 由于Matlab中未提供纹理填充选项&#xff0c;因此需要大家自行设法解决。 本文使用Kesh Ikuma制作的hatchfill2工具&#…

Nginx | 正向代理与Proxy插件整合

写在前面 &#x1f341;个人主页&#xff1a;微枫Micromaple 在企业开发环境中&#xff0c;局域网内的设备通常需要通过正向代理服务器访问互联网。正向代理服务器充当中介&#xff0c;帮助客户端请求外部资源并返回结果。局域网内也就是我们俗称的内网&#xff0c;局域网外的互…

docker安装etcd

1.查找etcd镜像 docker search etcdNAME: 镜像仓库源的名称 DESCRIPTION: 镜像的描述 STARS: 类似 Github 里面的 star&#xff0c;表示点赞、喜欢的意思。 OFFICIAL: 是否 docker 官方发布 2.拖取镜像并生成对应容器 docker run --name etcd -d -p 2379:2379 -p 2380:2380 …

zstd库数据压缩与解压缩

在 Visual Studio 2019 中使用 C 的 zstd 库进行数据压缩与解压缩 在今天的博客中&#xff0c;我们将探讨如何在 Visual Studio 2019 中使用 zstd 库进行高效的数据压缩和解压缩。zstd&#xff08;也称为 Zstandard 或 zstd&#xff09;是由 Facebook 开发的开源压缩库&#x…

每日一题24:数据操作之第N高的薪水

一、每日一题 表: Employee ------------------- | Column Name | Type | ------------------- | id | int | | salary | int | ------------------- 在 SQL 中&#xff0c;id 是该表的主键。 该表的每一行都包含有关员工工资的信息。查询 Employee 表中第 …

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 5月27日,星期一

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年5月27日 星期一 农历四月二十 1、 气象台&#xff1a;今天&#xff0c;广西、广东、福建等十余省份部分地区有大到暴雨&#xff0c;局地有雷暴大风等强对流天气。 2、 我国已有24省份已出台省级控烟相关法规&#xff0c;…

易备数据备份软件:从 .VMDK 文件中对虚拟机进行文件级别的恢复

VMDK 是 VMware 创建的开放式的文件格式&#xff0c;主要用于云计算和虚拟化服务。从基本上讲&#xff0c;.vmdk 文件是虚拟磁盘&#xff0c;其中包含 VMware 虚拟机的所有信息。 可以使用多种应用&#xff08;Winzip、7zip 等&#xff0c;当然也可以使用易备数据备份软件&…

2024年中国电机工程学会杯数学建模思路 - 案例:感知机原理剖析及实现

# 前言 2024电工杯(中国电机工程学会杯)数学建模思路解析 最新思路更新(看最新发布的文章即可): https://blog.csdn.net/dc_sinor?typebloghttps://blog.csdn.net/dc_sinor/article/details/128779911) 一、感知机的直观理解 感知机应该属于机器学习算法中最简单的一种算法…

杰理蓝牙WiFi芯片AC7916A—云信通讯

杰理蓝牙WiFi芯片AC7916A是一种高性能、低功耗的解决方案芯片&#xff0c;具有卓越的传输速度、连接稳定性和覆盖范围。其提供的多种芯片型号&#xff0c;可以满足不同场景的需求&#xff0c;例如&#xff0c;BLE Mesh Mesh网络、智能穿戴、身体监测、智能家居和灯光控制等。 …

辽宁省实验OJ 235. Sting(manacher+trie)

题目 登录 - Lnsyzx Online Judge 思路来源 辽宁省实验oj官方题解 题解 manacher&#xff0c;对回文这一半的串建个trie树&#xff0c; manacher初始对半径取min的时候&#xff0c;先倍增当前回文串定位到树上这个深度的位置 然后不断往外扩展时在trie树上扩展&#xff0c…

电脑太卡怎么办?这些技巧你必须知道

电脑卡顿是许多电脑用户都会遇到的问题&#xff0c;它可能导致工作效率低下&#xff0c;甚至影响到日常生活。可是电脑太卡怎么办呢&#xff1f;其实电脑卡顿问题通常是可以解决的&#xff0c;只要我们采取正确的方法。本文将介绍三种解决电脑卡顿问题的方法&#xff0c;帮助您…

Excel分类汇总,5个做法,提高数据处理效率!

在日常的工作中&#xff0c;我们经常需要使用Excel中的各种功能&#xff0c;Excel分类汇总功能无疑是数据分析和报告制作中的一把利器&#xff0c;它极大地提高了数据处理的效率和准确性。在现代商业环境中&#xff0c;数据无处不在&#xff0c;而如何从这些数据中提取有效信息…

2024年03月 Python(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 下列哪个命令,可以将2024转换成’2024’ 呢?( ) A:str(2024) B:int(2024) C:float(2024) D:bool(2024) 答案:A 本题考察的是str() 语句,将数字转换成字符串用到的是str() 语句。 …

html5各行各业官网模板源码下载(2)

文章目录 1.来源2.源码模板2.1 HTML5好看的旅行网站模板源码2.2 HTML5自适应医院叫号大屏模板源码2.3 HTML5好看的高科技登录页面模板源码2.4 HTML5宠物美容服务公司网站模板源码2.5 HTML5创意品牌广告设计公司网站模板源码2.6 HTML5实现室内设计模板源码2.7 HTML5黄金首饰网站…

安装mysql(windows)

一、安装依赖包 问题如下图所示&#xff1a;初始化数据库mysql报错&#xff0c;所以我们要提前安装缺少依赖包官网下载依赖包https://www.microsoft.com/zh-CN/download/details.aspx?id40784 二、安装mysql 1、官网下载mysql包 https://downloads.mysql.com/archives/co…