從Clojure/ClojureScript遷移到Rust:體積小4倍效能快50倍 - asciinema
asciinema-player 已經在 JavaScript 和 Rust 中從頭開始重新實現,使虛擬終端直譯器的速度提高了 50 倍,同時將 JS 包的大小減少了 4 倍。
是什麼促使我們要改變了之前的 ClojureScript 實現?儘管我很喜歡 Clojure/ClojureScript,但有幾個主要和次要問題我無法解決,主要圍繞以下 3 個方面:
- 速度 - 我希望播放器非常流暢,即使是最沉重的動畫錄音。由於 ClojureScript 的不可變資料結構,有很多物件一直被建立和垃圾收集,對於高幀率、繁重的動畫,這會給 CPU 和記憶體帶來很大壓力。Rust 中虛擬終端直譯器的新實現(編譯為 WASM)使其速度提高了 50 倍。額外的速度提升來自將檢視從 React.js 移植到SolidJS,這是目前最快的 UI 庫之一。
- 大小 - ClojureScript 編譯器的輸出包相當大。當您在 ClojureScript 中構建自己的應用程式時很好,但是當您提供一個庫供其他人在他們的網站上使用時,情況就很糟糕了。2.6 是 570kb(縮小)——超過半兆。該包包含整個 ClojureScript 標準庫、幾個流行且有用的庫,如試劑、core.async 和最後的 React.js(通過試劑)。新的 3.0 是純 JS,幾乎只有 SolidJS 作為唯一的依賴項(它本身很小)。這使得新播放器更小,約 140kb(縮小),即使它包含嵌入的 WASM 位元組碼(這使得包大小的大部分)。
- 與 JS 生態系統整合 - ClojureScript 與 JS 生態系統整合並不容易。我知道,這些年來在這個領域已經做了很多改進,我相信有人會立即指向我相關的文件,但與常規 JS 程式碼庫相比,它仍然是你需要多走的路,還有一些我上次檢查時沒有任何支援(例如在捆綁包中嵌入 WASM)。事情可能在這裡發生了變化,但上面的前兩個論點仍然成立,所以這是值得的。因此,您現在可以通過匯入asciinema-player npm package提供的 ES 模組在您自己的應用程式中使用播放器。
順便說一句,特別感謝 SolidJS 的作者 Ryan Carniato,他專注於速度和簡單性,同時不影響可用性。謝謝瑞安!
現在,除了上述所有內容之外,我在 Rust 中構建終端控制序列直譯器很有趣,為此使用了出色的資源 - Paul Williams 的 ANSI 相容視訊終端解析器。特別向保羅威廉姆斯致敬!
相關文章
- 從Perforce遷移到GitGit
- 谷歌的安卓13大幅度從C/C++遷移到Rust谷歌安卓C++Rust
- 從 golang flag 遷移到 cmdrGolang
- 從 Nginx 遷移到 Envoy ProxyNginx
- 從單體遷移到微服務的十二種方法微服務
- uniapp小程式遷移到TSAPP
- [譯]從 SQLite 逐步遷移到 RoomSQLiteOOM
- 從mpvue遷移到uni-appVueAPP
- EF Core從TPH遷移到TPT
- [譯] 從 SQLite 逐步遷移到 RoomSQLiteOOM
- Linode從Xen遷移到KVM
- 將表 從mysql 遷移到oracleMySqlOracle
- 更優效能與價效比,從自建 ELK 遷移到 SLS 開始
- Azure VM從ASM遷移到ARM(二)ASM
- Azure VM從ASM遷移到ARM(一)ASM
- PayPal從Java遷移到Node.jsJavaNode.js
- 從SpringMVC遷移到SpringbootSpringMVCSpring Boot
- 如何從複雜單體應用快速遷移到微服務?微服務
- 從單體架構遷移到 CQRS 後,DDD 並不可怕架構
- Meta/Facebook產品安全團隊將排程服務從Python遷移到Rust?PythonRust
- 使用DynamoShake從dynamodb遷移到mongodbMongoDB
- 從檔案系統遷移到ASM上ASM
- oralce 從檔案系統遷移到ASMASM
- 如果需要從Oracle遷移到MS SQLServer (2)OracleSQLServer
- 如果需要從Oracle遷移到MS SQLServer (1)OracleSQLServer
- 遷移到ASMASM
- 從 CRUD 遷移到事件溯源的祕訣 - eventstore事件
- Gradle指南之從Groovy遷移到KotlinGradleKotlin
- 從RabbitMQ平滑遷移到RocketMQ技術實戰MQ
- 記錄從vuecli打包庫遷移到rollup打包Vue
- 從Firebase+Redis遷移到PlanetScale+MySQLRedisMySql
- 我為什麼從Redux遷移到了MobxRedux
- [譯] 將現有的 API 從 REST 遷移到 GraphQLAPIREST
- 閃購網站Gilt從Rails遷移到Scala網站AI
- 將應用程式從Sql Server遷移到OracleSQLServerOracle
- 從 PDF 表單遷移到 IBM Lotus FormsIBMORM
- 從關聯式資料庫遷移到CouchDB資料庫
- 為什麼我會從MongoDB遷移到PostgreSQLMongoDBSQL