当前时间段(2023 年 11 月)开发 wasm 的最佳实现是什么? AssemblyScript? Go? Rust? C#?有已经应用的生产中的老哥来讨论下吗?

2023-11-25 16:50:01 +08:00
 retrocode

我尝试了下 rust 的 wasm, 相同算法对比 js 速度快了整整 30 倍, js 版的执行速度有 15 秒, 而 wasm 则只用了 500 毫秒.

准备研究一下 wasm 做技术储备, 介于目前市面上关于 wasm 的方案很多, 有什么已经成熟的库或框架推荐吗? 语言无所谓, 本身就是储备反正都要学习的.

我主要想了解下, 目前各个方案的差异, 比如性能提升程度, 如用 GO 写和用 Rust 写相同算法, 两方会有更明显的性能差异. 以及生态兼容性, 是否可以使用本身语言已存在的一些第三方依赖等等. 比如使用 AssemblyScript 的话对 npm 生态兼容性如何?

1785 次点击
所在节点    程序员
8 条回复
xieren58
2023-11-25 18:14:57 +08:00
当然是选 rust...
retrocode
2023-11-25 18:45:33 +08:00
@xieren58 主要问题是 他相对其他语言的版本有什么优势,这个我想了解下
yplam
2023-11-25 20:52:16 +08:00
看你用 wasm 的目的是什么,通常 CPU 密集型的代码才用 wasm ,rust 肯定是首选
DOLLOR
2023-11-25 21:41:25 +08:00
wasm 的一等公民是 C/C++/Rust ,最好就从这三个里选。
Jat001
2023-11-25 21:48:50 +08:00
想到一个好点子,我现在有个 cgo 写的 library ,不知道可不可以在 wasm 里跑,明天试试
tool2d
2023-11-25 22:52:15 +08:00
我测试下来,正常的业务逻辑 wasm 平均只比 js 快两倍。但是挺难用的,各种限制比较多,没有 JS 写起来自由。

当然很多密集型计算,wasm 是要快不少,但这种毕竟是少数。

前端大部分代码还是业务向,这点没办法。
EulerChen
2023-11-26 22:47:16 +08:00
排除 C#我不了解以外,我个人觉得优先选择如下
第一选择:C/C++,目前 C/C++/Rust 编译到 WebAssembly 基本上都是基于 LLVM ,编译产物在性能和体积方面区别不大,但是 C/C++存量代码比 Rust 很多,生态也更好,Rust 有的 C/C++都有,Rust 没有的 C/C++也有
第二选择:Rust ,感觉是政治正确的原因,Rust 看起来比 C/C++更火热,如果不想用 C/C++的话 Rust 是个不错的选择
第三选择:Go ,Go 编译到 wasm 需要用 TinyGo 编译器,但 Go 编译到 wasm 跟编译到 Native 有同样的缺陷,编译产物体积很大(塞了个 Runtime 进去),尽管 TinyGo 的后端也是基于 LLVM
第四选择:AssemblyScript ,编译器前端是手搓的(不太行),编译器后端是 Binaryen (大佬出品,值得信赖),基本不可能复用 npm 生态,AS 代码虽然看起来类似 TS ,但其实从类型系统的角度看根本不是一种语言,很少有 JS/TS 可以方便移植到 AS 上,这个项目最近两年已经处于半死不活的状态,除非你只会 JS/TS ,否则不推荐 AssemblyScript
dimwoodxi27
198 天前
@EulerChen go 确实编译后体积非常大,但都是包很大,但用 tinygo 加一些优化能从几百 kb 减小到 40-60kb 的样子,再能用特别方式能减小到 10-20kb ,最终体积跟 rust 差不多,tinygo 本身编译也是 cgo 编译器

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/995138

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX