从Clojure/ClojureScript迁移到Rust:体积小4倍性能快50倍 - asciinema


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 兼容视频终端解析器。特别向保罗威廉姆斯致敬!