

从Clojure/ClojureScript迁移到Rust:体积小4倍性能快50倍 - asciinema
source link: https://www.jdon.com/57817
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

从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 兼容视频终端解析器。特别向保罗威廉姆斯致敬!
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK