V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
retrocode
V2EX  ›  程序员

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

  •  
  •   retrocode · 2023-11-25 16:50:01 +08:00 · 1754 次点击
    这是一个创建于 368 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    前端大部分代码还是业务向,这点没办法。
    EulerChen
        7
    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
        8
    dimwoodxi27  
       176 天前 via Android
    @EulerChen go 确实编译后体积非常大,但都是包很大,但用 tinygo 加一些优化能从几百 kb 减小到 40-60kb 的样子,再能用特别方式能减小到 10-20kb ,最终体积跟 rust 差不多,tinygo 本身编译也是 cgo 编译器
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1604 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 16:52 · PVG 00:52 · LAX 08:52 · JFK 11:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.