從Clojure/ClojureScript遷移到Rust:體積小4倍效能快50倍 - asciinema

banq發表於2021-11-30

asciinema-player 已經在 J​​avaScript 和 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 相容視訊終端解析器。特別向保羅威廉姆斯致敬!

 

相關文章