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

有经验的专家写的代码,和无经验的新手写的代码,在运行时性能上大概会有多少差异?
个人感觉,常规业务逻辑代码通常可以差 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

科普:水冷负载的工作原理

水冷负载是一种利用水作为冷却介质&#xff0c;将电子设备产生的热量传递到外部环境的散热方式。它广泛应用于各种电子设备&#xff0c;如服务器、数据中心、电力设备等&#xff0c;以提高设备的运行效率和稳定性。本文将对水冷负载的工作原理进行简要科普。 水冷负载的工作原理…

我被恐吓了,对方扬言要压测我的网站

大家好我是聪&#xff0c;昨天真是水逆&#xff0c;在技术群里交流问题&#xff0c;竟然被人身攻击了&#xff01;骂的话太难听具体就不加讨论了&#xff0c;人身攻击我可以接受&#xff0c;我接受不了他竟然说要刷我接口&#xff01;&#xff01;&#xff01;&#xff01;这下…

C#多维数组不同读取方式的性能差异

背景 近来在优化一个图像显示程序&#xff0c;图像数据存储于一个3维数组data[x,y,z]中&#xff0c;三维数组为一张张图片数据的叠加而来&#xff0c;其中x为图片的张数&#xff0c;y为图片行&#xff0c;Z为图片的列&#xff0c;也就是说这个三维数组存储的为一系列图片的数据…

记录下所遇到远程桌面连接方法winSCP跟mstsc

之前公司使用过连接远程桌面&#xff0c;今天又遇到要使用远程桌面问题&#xff0c;来记录下。 之前公司使用的是winR 然后回车弹出 后面按照用户名密码就能登陆了 今天后台给了我一张图片准备接着用这个方法&#xff0c;后台就说这个东西要下载winSCP 后台发给我图片 然后去…

mfc140u.dll丢失的解决方法有哪些?怎么全面修复mfc140u.dll文件

mfc140u.dll丢失其实相对来说不太常见到&#xff0c;因为这个文件一般是不丢失的&#xff0c;不过既然有人遇到这种问题&#xff0c;那么小编一定满足各位&#xff0c;给大家详细的唠叨一下mfc140u.dll丢失的各种解决方法&#xff0c;教大家以最快最有效率的方法去解决mfc140u.…

python文件IO基础知识

目录 1.open函数打开文件 2.文件对象读写数据和关闭 3.文本文件和二进制文件的区别 4.编码和解码 读写文本文件时 读写二进制文件时 5.文件指针位置 6.文件缓存区与flush()方法 1.open函数打开文件 使用 open 函数创建一个文件对象&#xff0c;read 方法来读取数据&…

CentOS7 部署单机版 ElasticSearch + Logstash

一、部署ElasticSearch Elasticsearch部署参考下面文章&#xff1a; CentOS7 部署单机版 elasticsearch-CSDN博客文章浏览阅读285次&#xff0c;点赞6次&#xff0c;收藏3次。ElasticSearch&#xff0c;用于检索、聚合分析和大数据存储https://blog.csdn.net/weixin_44295677…

定个小目标之每天刷LeetCode热题(1)

有两种解决方法&#xff1a; 第一种&#xff1a;利用哈希集合不重复的特性&#xff0c;代码展示如下 public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {Set<ListNode> listNode new HashSet<ListNode>();ListNode…

一招搞定!家里灰尘多?教你如何轻松清理,推荐必备神器

在现代生活中&#xff0c;灰尘无处不在&#xff0c;特别是在大城市&#xff0c;空气中的污染物更多&#xff0c;导致家里的灰尘积聚速度加快。保持家居环境的干净和整洁不仅能提升生活质量&#xff0c;还能保护我们的健康。作为一名家电博主将为你提供详细的家里灰尘清理方法&a…

EtherCAT运动控制器在UVW对位平台中的应用

ZMC406硬件介绍 ZMC406是正运动推出的一款多轴高性能EtherCAT总线运动控制器&#xff0c;具有EtherCAT、EtherNET、RS232、CAN和U盘等通讯接口&#xff0c;ZMC系列运动控制器可应用于各种需要脱机或联机运行的场合。 ZMC406支持6轴运动控制&#xff0c;最多可扩展至32轴&#…

Taro React组件开发 —— RuiVerifySlider 行为验证码之滑动拼图

1. 效果预览 2. 使用场景 账号登录,比如验证码发送,防止无限调用发送接口,所以在发送之前,需要行为验证! 3. 插件选择 AJ-Captcha行为验证码文档AJ-Captcha行为验证码代码仓库为什么要选用【AJ-Captcha行为验证码】呢?因为我们管理后台使用的是 pigx ,它在后端采用的是【…

双盲插技术引领行业变革:USB-C便携显示器新篇章

USB TYPE-C接口显示器技术解析&#xff1a;LDR6282芯片与双盲插全功能方案 随着USB TYPE-C接口技术的普及和USB4标准的推出&#xff0c;传统HDMI和DisplayPort接口的地位正逐渐受到挑战。USB TYPE-C接口以其小巧、高速、多功能的特性&#xff0c;正逐步成为显示器和电视机接口…

IDEC和泉触摸屏维修显示屏HG1G-4VT22TF-S

IDEC触摸屏维修故障有&#xff1a;黑屏、花屏、按触摸屏无反应或反应慢、内容错乱、进不了系统界面、无背光、背光暗、有背光无字符、不能通信、按键无反应等。 和泉IDEC触摸屏维修常见型号&#xff1a;HG2A-SS22CF、HG2F-SS22VF 、HG2F-SS52VF、HG3F-FT22TF-B、HG3F-FT22TF-W、…

探索数据结构:单链表的实践和应用

&#x1f511;&#x1f511;博客主页&#xff1a;阿客不是客 &#x1f353;&#x1f353;系列专栏&#xff1a;渐入佳境之数据结构与算法 欢迎来到泊舟小课堂 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 ​ 一、前言 前面我们学习了数据结构中的顺序表&…

前端JS必用工具【js-tool-big-box】学习,获取全球重点城市时间

我们去住一些旅馆的时候&#xff0c;或者一些国际性网站&#xff0c;经常可以看见他们的钟表会展示一些国家地区的时间&#xff0c;这个就是很常用的功能。但如果不常接触这个功能的开发网站呢&#xff0c;大家就看自己电脑右下角的时间展示&#xff0c;就是自己当前的具体时间…

2024年【G2电站锅炉司炉】免费试题及G2电站锅炉司炉复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【G2电站锅炉司炉】免费试题及G2电站锅炉司炉复审考试&#xff0c;包含G2电站锅炉司炉免费试题答案和解析及G2电站锅炉司炉复审考试练习。安全生产模拟考试一点通结合国家G2电站锅炉司炉考试最新大纲及G2电站锅…

新手必看!TikTok视频0播放的5大原因及解决方法

很多刚起步的TikTok卖家常会遇到一个烦心事&#xff1a;发布的视频播放量少得可怜&#xff0c;甚至有时是0播放。这确实让人挺沮丧的。到底如何突破TikTok视频总是播放量为0的瓶颈&#xff1f;别担心&#xff0c;今天为大家总结了tiktok视频播放量上不去的5种原因和相应的解决方…

以JVM新特性看Java的进化之路:从Loom到Amber的技术篇章

引言&#xff1a; JVM的最新特性通过在效率、功能和易用性方面的创新&#xff0c;对Java的未来发展产生了深远的影响。以下是几个关键特性如何塑造了Java的未来&#xff1a; 正文&#xff1a; 轻量级并发 - 项目Loom&#xff1a; 项目Loom通过引入虚拟线程&#xff08;也被称为…

使用vue,mybatis,mysql,tomcat,axios实现简单的登录注册功能

目录 第一步环境搭建 后端&#xff1a; 前端&#xff1a; 第二步画流程图 web: service: dao层&#xff1a; 第三步前端代码的实现 这是开始的页面&#xff0c;接下来我们要到router路由下书写#login的路径 路由中的component在我们自己创建的views书写vue文件…

某安全厂商外包安服工程师面试

写在前面&#xff1a;本篇帖子出现的厂商and面试问题皆为up实际面试情况&#xff0c;厂商信息不透露&#xff0c;仅供师傅们参考。 背景 某知名安全厂商外包 岗位&#xff1a;安全服务工程师&#xff08;偏售后&#xff09; 薪资条件&#xff1a;7~9k&#xff08;up所在二线…