精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

?TypeScript 源碼啟示:驚人的52000行代碼文件

開發 開源
我們在 review 各大開源 js 倉庫性能實踐的時候注意到:ts 源碼的 checker.ts 這個文件相當暴力,它將 TS 完整類型系統全部邏輯 5.2 萬行全部寫在一個 ts 文件里,而文件大小則達到了驚人的 2.92 MB , 這相當為什么?

作者 | ecznlai

重型 JS 項目的性能問題一向很難,我們在 review 各大開源 js 倉庫性能實踐的時候注意到:ts 源碼的 checker.ts 這個文件相當暴力,它將 TS 完整類型系統全部邏輯 5.2 萬行全部寫在一個 ts 文件里,而文件大小則達到了驚人的 2.92 MB —— 這相當有趣,為什么?

大名鼎鼎的 checker.ts 這個文件我很久以前就知道了, 在 Github 上直接打不開:Github - microsfot/Github: ./src/compiler/checker.ts

好,VSCode,啟動:

五萬行 all-in-one 的 checker.ts

這個文件很暴力,類型系統全部邏輯 5 萬行 all-in-one file ,是 ts 源碼維護者不會寫代碼嗎?顯然并不是,我翻了一些資料和讀了下其中的實現,稍微震撼了一下,將相關思考細節記錄在本文。

低配版 named parameters

眾所周知,js 各種規范都推薦你用一個對象來傳遞多個參數,然后在函數里解構 —— 多數時候這沒什么,但是在 ts compiler 里,任何浪費都會被極限放大,因此他們用了這種低配版用注釋的方式來表示 named parameters (這行還是 anders 老爺子寫的,C# 之父 編程領域的傳奇!C#、TypeScript之父!全世界最頂尖的程序員之一。-騰訊云開發者社區-騰訊云 )

何為 named parameter 呢?其實就是帶名字標簽的函數,調用的時候可以指定標簽來傳參數,這個在其他語言里是基操,比如 moonbit or swift 里的標簽函數:

fn add(~left: Int, ~right: Int) -> Int {
  return left + right;
}

add(left: 1, right: 44); // ?? 
add(right: 44, left: 1); // ?? 
add(1, 2);               // ??此時會自動匹配到 left 和 right

為什么 ts 需要 named parameter 特性: 在 ts 這種高頻調用場景里通過解構 options 對象的方式傳參會導致大量無謂的內存開銷 —— 這通常會導致 type checking 過程中的內存峰值而造成頻繁 gc & mem_copy 更重要的是字面量 key 的順序還會影響 v8 的 inline caches 優化,寫的不好可能會對函數調用 feedback 造成嚴重負面反饋進而影響 TurboFan 的進一步優化最后造成非常大的性能損失 ...

當 V8 函數調用的 feedback slot 從 SMI 變成 Any 時,TurboFan codegen 的匯編將會慢三倍,關于這個問題的細節,我們在這里有深度討論&實踐。

能用 number 盡量 number

比如 switch、比如 const enum、比如各種 enum bitmap flags 等等設計,原因是 object 和 string 的開銷太大了,而小一點的整數在 v8 里甚至是無開銷的(如果 SMI tagged pointer 指針自身數值不算開銷的話)。

無限制使用 const enum

const enum 有個特性可以直接 inline 枚舉值到函數里變成立即數,能享受極致優化:

但目前社區對于 const enum 的主流意見是 不推薦使用,而且 ts 的部分維護者也認為這個是 mistake:

但是這說法其實相當尷尬:是的雖然這是 mistake 我們不推薦使用,但我們 ts 源碼里全都是 const enum 到處飛 ... (800+ 個 const enum,沒這個特性估計 tsc 要慢不少)

ESM/CJS 的性能問題:尤其是 export 導出特別多的時候

當 export 導出太多成員的情況下,V8 內部處理這類對象會將其變成 Slow Properties 字典模式,在多數時候這沒啥,但如果遇到某高頻模塊內的常量被引用大幾百萬次的情況下,此時 export.xxxxx 的點讀查詢開銷就不能忽視了,尤其是當 export 上有幾百個導出的時候,此時點讀開銷不可忽視,比如:

const constant = require(`./constant`);

module.export = function getXXConfig() {
  return constant.xxx + constant.bbb;
}
// 由于 constant 上有幾百個常量,
// 即使是 constant.xxx 這樣簡單的語句
// 在百萬次調用的時候,其耗時將不可忽略 ( 幾百 ms 以上 )

而 checker.ts 則是將所有東西 all in one,就沒這問題了,全都在函數作用域內,查詢時間是 O(1)。

ESM 沒有 private 導出

有種 export 是只想在項目內無限制使用,但是又不期望導出能被外部的 npm 看到 —— 也就是 esm 沒有提供 private export 這種特性:

import D from '@tencent/xxx/a/b/c/d';
// ?? 我不期望別人能這樣 import 我內部的東西

而 ts 又恰恰要這種特性,那么它們怎么實現的呢?通過 /** @internal */ 注解,比如:

標記為 @internal 的東西在生成 d.ts 的時候會被抹去,變相實現外部無法 import 而 ts 倉庫內隨便 import 。

ts 甚至大量使用 var,而不是用 let 和 const

又比如,有部分函數為了性能全用 var,愣是沒用 const / let 這些,你看 ts 怎么寫的:

具體見: github.com/microsoft...

大意是 ts 的場景下,v8 這類 js runtime 的 TDZ 檢查甚至會相當影響運行性能。。。畢竟五萬行呢。。。(production build 會比 dev build 要快不少的原因之一)

往 String.prototype.xxx 上注入東西

這類操作在普通 js/ts 項目里是一定會被鄙視的,但一個靜態類型語言怎么沒辦法自己拓展基礎類型來使用呢?(這在 swift / go 之類的語言里基于 string / int 來搞出一個新的類型出來是基操。)

無類編程,推崇組合編程

checker.ts 幾萬行核心邏輯幾乎沒有 class 和繼承,完全通過函數組合的方式來架構代碼,整體看著像是有 rust impl 關鍵字的 ts 那樣:

代碼里大部分函數都是上面這種風格,第一個參數是「核心接口」其他參數則是對應的參數,當然,組合優于繼承也算是近年來業界達成的共識了。

當然比起架構,我更愿意相信 ts 是考慮到 class 繼承可能存在潛在的性能問題導致的:

比如 V8 引擎下的 A extends B 場景,B 上面有個方法 fn,當 A.fn(); B.fn(); 都調用了之后,如果 A 和 B 的 shapes 不一樣,此時 fn 調用 feedback slot 會從 monomorphic 的變成 polymorphic 的,當繼承三個以上的時候就會變成 megamorphic 了,這會影響引擎 ICs 的優化效果,導致性能下降。

怎么沒有用「表驅動」這種所謂的常用「前端設計模式」?

圖片

源碼里很多這種根據 ast node kind 去走不同邏輯,然后這些邏輯都寫成 if else if else 或者 switch 語句 —— 為何不使用一個 Record<Kind, Fn> 的方式去表驅動呢?

原因很簡單:表驅動無法被 v8 這類 runtime 靜態分析優化,而且表驅動這類寫法會慢個幾十倍對于基礎設施來說這是不可接受的。(無貶義,js 的表驅動寫法看場景,高頻調用還是別了吧,寫 event selector 之類的倒是一類比較合適的場景)。

從語言特性的層面來說,ts 真的缺一個滿血版模式匹配 + enum adt 了,但目前 ts 原則上是不會再合入新的 runtime 特性了 —— 這就很難受了,又不能表驅動,又不能模式匹配,最后代碼很 C style 了,而且要寫非常多的 x is X 謂語 。

基本沒有 try-catch

與 go 有類似的想法,checker.ts 里通過返回值 + 往 context.xxx 上寫東西的方式來指示異常,一方面是為了性能,另外一方面我甚至可以合理懷疑為是沒有 checked exception 導致只能這樣才能 type checked ... (當然 anders 老爺子應該是 uncheck 黨,參考 C# 的設計)

文件多才是大問題 —— 可惜了半成品的 ts namespace

如果有接觸過大型 js/ts 項目的同學肯定知道,文件一多就不知道東西在哪了,找個 import 你甚至要垮十幾個文件 。

—— 從這也可看到,東西為什么要 import 才讓用呢?能否有 moonbit、rust 那樣好用的模塊系統呢??? 但這依然涉及 runtime 改造,現階段 ts 就別想了,當然 tc39 也不會再考慮這類特性就是了,等一個 TypeScript Pro Max 吧。

關于 namespace:有接觸過 go Rust C++ 的同學應該都有了解了,是用來管理包及語言符號的特性,是業內比較通用的解決方案。

在 ESM 落地之前,ts 有嘗試去做滿血版的 namespace 特性,但是由于重新確定了不做運行時的想法,因此這個特性在成熟之前就放棄迭代而全面轉向 ESM 了,至今 ts 源碼里還大量使用 namespace 或者用 ESM 模擬出 namesapce 特性:

最后來個暴論:JS 已經嚴重影響 TS 的演進了

不得不說,ts 如果繼續死磕 js/tc39 而放棄做 runtime feature,恐怕現在已經是最終形態了 ... 以后不會有更進一步的演進了,因為目前 ts 類型系統已經相當完善了,甚至部分能力其他語言都沒有,比如 Union Types 以及領先各大友商的控制流分析技術(然而,2024 了 ts 還沒有滿血版 ADT + 模式匹配,因為這屬于 runtime 特性,不是簡單擦掉類型就能搞定的)。

當然,近期 tc39 雖然也提了不少新東西但是沒有靜態類型系統就顯得這些特性相當雞肋以至于它們看起來就像是 ts39 一樣,比如備受關注的 Record & Tuple 已經到 Stage 2 了,但懂得都懂這特性一看就知道明顯就是給 ts 設計的,給 js 用這個特性跟到處傳 void* 一樣沒什么區別,因為這東西是運行時強類型的,也就是訪問 one_record.x 如果真的沒有定義 x 那么會直接拋出 error 的而不是返回 undefined。

此外這東西太猛了,幾乎就是一個 C 語言版的 匿名 struct 定義對象+內存結構的方案了,我估計各大瀏覽器估計都不太想搞這個 —— 這個要大改引擎的 js 對象模型了,如果真能實裝我很期待它的性能表現。

總之,就目前 ts 源碼倉庫來看,js 自身的語言特性已經極其限制 ts 對其自身的實現了,但是 ts 又承諾不再做新的 runtime 特性,只做類型系統,這就相當擰巴了,尤其是體現在 ts 源碼里,這要是放在公司,晉級 CR 估計要涼透了(悲)

EOF

checker.ts 已經搞出幾萬行文件以及大量 if-else 超高復雜度的控制流了,還自己手寫 named para 注釋、甚至不用 const / let / class 。而且從代碼里處處可見 ts 相當鄙視 esm 和 cjs 這些 module 方案,覺得性能不行,然后搞出來一個半成品的 namespace 模塊方案。

總之由于 js 特性太少了,導致源碼實現相當擰巴,雖然如此但 ts 整體的 compiler pipeline 架構設計卻相當漂亮和簡潔,尤其是 transfomers 和 anders 老爺子主推的 LSP 所帶來的 IDE 革命,有機會我單開一篇談談這個。

責任編輯:趙寧寧 來源: 騰訊技術工程
相關推薦

2015-02-06 09:37:13

程序員

2021-02-18 18:47:02

比特幣加密貨幣區塊鏈

2018-10-07 15:10:49

2022-08-04 09:01:45

TypeScriptMicrosoft

2021-01-06 14:42:09

前端Typescript代碼

2009-05-20 13:28:28

蘋果Iphone移動OS

2020-06-10 07:40:36

CPU內核態多線程

2020-05-06 22:01:52

Excel代碼Python

2022-07-14 16:27:11

邊緣計算智慧城市應用

2025-01-14 00:01:01

2021-02-20 23:33:34

TypeScript代碼開發

2012-12-24 09:45:21

2022-11-03 18:28:05

C語言Vely

2024-05-07 16:38:25

2025-02-26 10:11:01

2022-11-07 07:04:25

2017-04-10 09:59:08

python代碼愛心線

2017-03-06 15:01:38

Python代碼詞云

2017-04-05 11:10:23

Javascript代碼前端

2020-12-24 07:02:07

CSS框架
點贊
收藏

51CTO技術棧公眾號

日韩欧洲国产| 国产777精品精品热热热一区二区| 日韩和欧美一区二区| 最新日韩中文字幕| 黄色国产在线视频| 免费福利视频一区二区三区| 国产精品国产三级国产| 国产乱码一区| а中文在线天堂| 国产一区观看| 色偷偷偷综合中文字幕;dd| 欧美xxxx日本和非洲| 视频在线日韩| 午夜久久久久久| 一区一区视频| 欧美日韩伦理片| 国产精品一区二区三区99| 久久免费精品视频| 婷婷激情四射网| 波多野结衣在线一区二区| 日本乱码高清不卡字幕| 91黄色在线看| 浪潮av一区| 久久精品一区二区| 国产美女在线精品免费观看| 怡红院男人天堂| 亚欧美中日韩视频| 国外成人免费在线播放| 黑人狂躁日本娇小| 神马影视一区二区| 亚洲成人动漫在线播放| 亚洲一级免费观看| gay欧美网站| 午夜精品久久久久久久| 毛片在线视频观看| wwwav在线| 一区视频在线播放| 亚洲欧洲国产日韩精品| 黄上黄在线观看| 青青草一区二区三区| 欧美激情视频一区二区| 日日噜噜夜夜狠狠久久波多野| 久久99影视| 亚洲精品自拍视频| 一级黄色免费视频| 黄色网一区二区| 亚洲第一天堂av| 在线播放av网址| 综合久久成人| 精品国产伦一区二区三区免费| 杨幂一区二区国产精品| 国色天香久久精品国产一区| 欧美一区二区三区在线| 污视频网址在线观看| 色噜噜成人av在线| 欧美电影在线免费观看| 色噜噜狠狠一区二区三区狼国成人 | 国产精品一区二区在线观看不卡| 成人信息集中地欧美| 国产麻豆一精品一男同| 国产黄色成人av| 99久久精品免费看国产一区二区三区 | 自拍偷拍第9页| 色婷婷色综合| 中文字幕精品在线视频| 99久久久无码国产精品不卡| 性xxxx欧美老肥妇牲乱| 久久综合久久美利坚合众国| 加勒比av在线播放| 国产亚洲成人一区| 国产成人精品久久二区二区| 在线观看中文字幕网站| 激情综合一区二区三区| 福利视频一区二区三区| 亚洲 美腿 欧美 偷拍| 久久久99精品免费观看不卡| 午夜精品短视频| 成人免费网址| 欧美日韩激情网| 鲁一鲁一鲁一鲁一av| 电影一区中文字幕| 亚洲精品国产电影| 一级片久久久久| 欧美高清一区| 欧美一乱一性一交一视频| 国产精品xxxxxx| 国产乱人伦精品一区二区在线观看| 岛国视频一区| 成人动漫在线播放| 一区二区三区不卡在线观看| 黄色免费视频大全| 国产人与zoxxxx另类91| 亚洲白拍色综合图区| 人妻视频一区二区| 国内综合精品午夜久久资源| 国产不卡在线观看| 国产肥老妇视频| 久久综合久久久久88| 一区二区91美女张开腿让人桶| 久久大胆人体| 欧美性做爰猛烈叫床潮| 国产精品熟妇一区二区三区四区 | 中文字幕v亚洲ⅴv天堂| 精品少妇久久久久久888优播| 三级久久三级久久久| 亚洲最大福利视频| 国产露出视频在线观看| 亚洲五月六月丁香激情| a在线观看免费视频| 国产精品毛片视频| 久久久久99精品久久久久| av大全在线观看| 国产91在线观看丝袜| 五月天亚洲综合情| 97成人资源| 亚洲精品99久久久久| 538精品在线视频| 免费成人美女在线观看| 久久99久久精品国产| av电影免费在线观看| 在线看国产日韩| 精品一区二区视频在线观看| 欧美亚洲不卡| 91九色精品视频| 天堂资源在线中文| 欧洲另类一二三四区| 醉酒壮男gay强迫野外xx| 欧美国产另类| 91大片在线观看| 国产成人高清精品| 欧美性感一区二区三区| 中文精品在线观看| 亚洲在线视频| 精品日产一区2区三区黄免费 | 中文字幕免费精品| 91精品国产综合久久香蕉的用户体验 | 91精品美女| 亚洲视频在线免费观看| 一本一道无码中文字幕精品热| www.日韩精品| a在线视频观看| 丝袜久久网站| 日本亚洲欧洲色α| 福利在线观看| 欧美色图在线观看| 一本色道久久88| 另类欧美日韩国产在线| 亚洲一区二区三区涩| 日韩成人一区| 久久伊人色综合| a天堂中文在线观看| 一区二区三区在线观看国产| 先锋资源在线视频| 亚洲第一黄网| 久久久久久久久一区二区| 九色porny丨首页入口在线| 亚洲国产天堂久久综合| 欧美一级特黄视频| 国产色综合久久| 成人免费在线观看视频网站| 欧美丰满老妇| www.成人av.com| av在线播放资源| 亚洲欧美成人精品| 中文字幕在线观看免费| 亚洲美女偷拍久久| 日韩少妇一区二区| 亚洲欧美高清| 亚洲人体一区| 波多野结衣欧美| 日本久久久久久久| 欧美成人三区| 精品成人免费观看| 日本黄色中文字幕| 亚洲欧美aⅴ...| 精品人妻一区二区三区日产| 免费视频一区| 先锋影音男人资源| 久久97久久97精品免视看秋霞| 68精品国产免费久久久久久婷婷 | 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 国产一级特黄a大片免费| 久久中文字幕av一区二区不卡| 97中文在线观看| 毛片无码国产| 九九热这里只有在线精品视| 日本不卡免费播放| 51久久夜色精品国产麻豆| 国产一级二级三级| 国产精品网站在线| 97精品人妻一区二区三区蜜桃| 久久精品人人做人人爽电影蜜月| 日韩 欧美 自拍| 日韩av午夜| 亚洲自拍小视频| 亚洲日本网址| 国模极品一区二区三区| 香蕉视频网站在线观看| 日韩精品福利网站| 国产美女免费视频| 在线欧美日韩精品| 九九热国产视频| 亚洲色图19p| 色欲AV无码精品一区二区久久| 国产在线精品免费| 日本激情视频在线| 亚洲精品美女| 黄色一级大片免费| 日韩在线理论| 欧美一二三四五区| 国产精品对白| 亚洲自拍偷拍第一页| 成人在线视频免费看| 2019中文字幕在线| 日韩免费影院| 成年无码av片在线| 91caoporn在线| 亚洲日本中文字幕| 天天干在线观看| 日韩精品一区二区三区中文精品| 亚洲一区二区视频在线播放| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 国产综合在线视频| 污污在线观看| 久久艹在线视频| 国精产品一区| 俺去啦;欧美日韩| 亚洲图片88| 在线精品高清中文字幕| 精华区一区二区三区| 亚洲娇小xxxx欧美娇小| 人妻妺妺窝人体色www聚色窝| 日韩一区二区视频| 99精品在线看| 91精品国产91久久综合桃花| 亚洲自拍偷拍另类| 欧美日韩国产bt| 中文字幕无码乱码人妻日韩精品| 色久综合一二码| 日本精品入口免费视频| 在线视频你懂得一区二区三区| 国产99免费视频| 在线亚洲精品福利网址导航| 无码一区二区三区| 欧洲中文字幕精品| 中文字幕在线播放不卡| 欧美日韩高清一区二区| 91国内精品久久久| 4438成人网| 丰满人妻妇伦又伦精品国产| 欧美成人video| 色欲av永久无码精品无码蜜桃| 亚洲国产精品电影在线观看| 日本xxxxwww| 亚洲精品中文字幕女同| 国产午夜在线观看| 日韩中文理论片| 成人短视频在线观看| 欧美日本国产在线| mm视频在线视频| 国产盗摄xxxx视频xxx69 | 国产精品视频一区二区三区经| 黄色免费大全亚洲| 日韩av一区二区三区在线| 日本激情一区| 国产精品啪啪啪视频| 在线成人h网| 欧美xxxxx在线视频| 免费高清在线一区| 丰满少妇中文字幕| 91免费国产在线观看| 99久久精品免费视频| 中文字幕一区二区三区不卡在线| 欧美日韩偷拍视频| 日韩欧美在线免费观看| 在线免费观看一级片| 日韩欧美一级精品久久| 日本五码在线| 久久精品国产欧美亚洲人人爽| 波多野结衣在线高清| 国产精品99久久久久久人 | 亚洲午夜精品久久久中文影院av | 国产色噜噜噜91在线精品 | 亚洲aⅴ日韩av电影在线观看 | 日本在线成人一区二区| 亚洲老妇激情| 美女福利视频在线| 国产一区福利在线| 91视频在线网站| 亚洲欧美国产高清| 国产一卡二卡三卡| 欧美不卡123| 国产福利小视频在线| 欧美国产日产韩国视频| 欧美国产日韩电影| 国产自产在线视频一区| 日韩在线理论| 国产精品动漫网站| 国产麻豆91精品| 国产精品免费无码| 天天爽夜夜爽夜夜爽精品视频| 中文字幕有码无码人妻av蜜桃| 亚洲精品mp4| av在线导航| 国产精品久久久久久av| 哺乳挤奶一区二区三区免费看| 亚洲欧美日产图| 午夜一区在线| 人妻互换一二三区激情视频| 亚洲国产精品v| 成人午夜视频在线播放| 日韩免费观看高清完整版| 在线视频婷婷| 国产成人精品视频在线观看| 高清精品xnxxcom| 国产一区二区三区播放| 麻豆高清免费国产一区| 最近中文字幕在线mv视频在线| 亚洲国产精品一区二区www在线 | 欧洲av一区二区| 久久www免费人成精品| 欧美区亚洲区| 香蕉视频xxxx| 日韩理论片在线| 一级特黄aaa大片| 亚洲香蕉伊综合在人在线视看| 久草在线资源福利站| 成人久久18免费网站漫画| 欧美电影免费| 久久这里只精品| 中文在线资源观看网站视频免费不卡| 91porny在线| 日韩精品亚洲精品| 国产白浆在线免费观看| 国产欧美一区二区三区另类精品| 欧美日韩三级| 91精产国品一二三| 一个色妞综合视频在线观看| 国产sm主人调教女m视频| 久久国产精品久久久久久| 999精品嫩草久久久久久99| 一区二区不卡在线| 国产综合久久久久影院| 日韩欧美综合视频| 欧美一区二区精美| 欧美1—12sexvideos| 粉嫩精品一区二区三区在线观看 | 亚洲日本在线看| 国产麻豆精品一区| 欧美夫妻性生活xx| 欧美巨大xxxx| 国产欧美高清在线| 欧美激情一区二区三区全黄| 亚洲永久精品一区| 色婷婷综合成人av| 精品久久国产一区| 欧美一级视频在线播放| 91玉足脚交白嫩脚丫在线播放| 亚洲免费在线观看av| 亚洲免费电影一区| 黑人一区二区三区| 99热都是精品| 成人在线视频一区| 天天干天天干天天| 中文字幕亚洲综合久久| 国产精久久久| 六月婷婷在线视频| 久久久精品综合| 一区二区视频播放| 欧美精品一区三区| 欧洲在线一区| 黄色片视频在线| 亚洲一区二区三区四区不卡| 天堂а√在线8种子蜜桃视频| 国产成人精品免高潮费视频| 国产精品久久久久一区二区三区厕所 | 国产精品亚洲综合在线观看| 久久久天堂国产精品| 99精品在线观看视频| 国产免费a视频| 欧美精品一本久久男人的天堂| 亚洲高清极品| 久久久久久久久久一区| 午夜视频在线观看一区二区| 极品美乳网红视频免费在线观看 | 亚洲成人福利在线观看| 亚洲欧美日韩国产综合| 亚洲欧美日韩成人在线| 成人免费激情视频| 一区二区三区福利| 欧美 日韩 国产 一区二区三区| 亚洲激情 国产| 欧美综合社区国产| 激情综合在线观看| 成人免费在线视频观看| 日本天堂在线| 成人av免费看| 久久精品国产久精国产爱| 日韩欧美高清在线观看| 久久久精品国产亚洲|