從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 相容視訊終端解析器。特別向保羅威廉姆斯致敬!
相關文章
- uniapp小程式遷移到TSAPP
- 從 Nginx 遷移到 Envoy ProxyNginx
- 從 golang flag 遷移到 cmdrGolang
- 從單體遷移到微服務的十二種方法微服務
- 谷歌的安卓13大幅度從C/C++遷移到Rust谷歌安卓C++Rust
- 使用DynamoShake從dynamodb遷移到mongodbMongoDB
- 從mpvue遷移到uni-appVueAPP
- [譯]從 SQLite 逐步遷移到 RoomSQLiteOOM
- [譯] 從 SQLite 逐步遷移到 RoomSQLiteOOM
- EF Core從TPH遷移到TPT
- Meta/Facebook產品安全團隊將排程服務從Python遷移到Rust?PythonRust
- 更優效能與價效比,從自建 ELK 遷移到 SLS 開始
- Gradle指南之從Groovy遷移到KotlinGradleKotlin
- 如何從複雜單體應用快速遷移到微服務?微服務
- 從單體架構遷移到 CQRS 後,DDD 並不可怕架構
- Spring Boot 從1.5遷移到2.0.5 - DZone JavaSpring BootJava
- 從eclipse遷移到idea(1 安裝篇)EclipseIdea
- 案例:微服務從Java/SpringBoot遷移到Golang微服務JavaSpring BootGolang
- 如何從 AWS CodeCommit 遷移到極狐GitLab?MITGitlab
- 從Firebase+Redis遷移到PlanetScale+MySQLRedisMySql
- Android技術棧(一)從Activity遷移到FragmentAndroidFragment
- 從eclipse遷移到idea(2 使用習慣篇)EclipseIdea
- 從過時的 Windows 機器遷移到 LinuxWindowsLinux
- 從RabbitMQ平滑遷移到RocketMQ技術實戰MQ
- 記錄從vuecli打包庫遷移到rollup打包Vue
- 從 CRUD 遷移到事件溯源的祕訣 - eventstore事件
- 從 Newtonsoft.Json 遷移到 System.Text.JsonJSON
- 使用SpringCloud將單體遷移到微服務SpringGCCloud微服務
- svn 遷移到gitGit
- 將spfile從ASM裡遷移到檔案系統ASM
- Dcat Admin 教程 - 如何從 Laravel admin 遷移到 dcat admin?Laravel
- 如何從阿里雲ECS遷移到AWS EC2?阿里
- 如何平穩地從nacos遷移到r-nacos?
- 平安科技從 Oracle 遷移到 UbiSQL 的實踐OracleSQL
- 為何我們前端從Vue 2遷移到Svelte?前端Vue
- 如何從 vue-element-admin 遷移到 Fantastic-adminVueAST
- 【遷移】SqlServer 遷移到 MySQL 方法ServerMySql
- WSL遷移到其他磁碟