写前端的很好奇, WASM 是怎么做到同时在 ARM 和 x86 CPU 上运行的?如果是转译,性能损耗有多少? Google 一直没搜到答案。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
请不要在回答技术问题时复制粘贴 AI 生成的内容
edis0n0

写前端的很好奇, WASM 是怎么做到同时在 ARM 和 x86 CPU 上运行的?如果是转译,性能损耗有多少? Google 一直没搜到答案。

  •  
  •   edis0n0 Aug 14, 2022 3705 views
    This topic created in 1353 days ago, the information mentioned may be changed or developed.
    13 replies    2022-08-15 16:25:07 +08:00
    xieqiqiang00
        1
    xieqiqiang00  
       Aug 14, 2022
    直接就写在百科里,“WebAssembly 的设计与实现原则,包含:定义一个可移植,具有大小与加载高效率的二进制格式,作为编译标的。这个编译标的必须可以被编译至常见的平台,包含移动端与物联网,并且可以善用硬件资源、有原生执行码的执行速度。”
    edis0n0
        2
    edis0n0  
    OP
       Aug 14, 2022
    @xieqiqiang00 编译标的必须可以被编译至常见的平台 所以是编译成 x86 还是 ARM 的文件?
    xieqiqiang00
        3
    xieqiqiang00  
       Aug 14, 2022
    @edis0n0 “可以被编译至常见的平台”,啥也不是
    zhouyg
        4
    zhouyg  
       Aug 14, 2022
    wasm 本身也是一个中间产物,arm 和 x86 在执行的时候用的也是自己平台上实现的 runtime 来执行
    wxf666
        5
    wxf666  
       Aug 15, 2022
    我目前觉得 wasm 效率比本地原生差很多

    我是在使用 squoosh (一个浏览器端图片转码工具)时感受到的

    特别是里面的 avif 转码,我拿本地的 avifenc 比了一下。相同照片和参数,浏览器 wasm 实现的耗时,是本地 avifenc 实现的 5~6 倍
    dianqk
        6
    dianqk  
       Aug 15, 2022 via Android
    一个不怎么准确的理解方式:Wasm 和 Javascript 一样,都是用一个解释器(虚拟机)去执行代码,在这一层抹除了底层架构的差异。而二者的差异的话,比如 Javascript (浏览器上)都是从 js 文件本身的解析开始,Wasm 将不同语言编写的代码编译到 Wasm 字节码。Wasm 详细介绍可以看看 WebAssembly 原理与核心技术。
    someonedeng
        7
    someonedeng  
       Aug 15, 2022
    > 计算机科学领域的任何问题都可以通过增加一个简介的中间层来解决。

    大概也是有类似的 runtime 吧
    iikebug
        8
    iikebug  
       Aug 15, 2022
    @wxf666 可能本地转码有其他优化手段呗,wasm 用不了或者没编译,不能简单这样比较性能的
    icexin
        9
    icexin  
       Aug 15, 2022
    一般是通过 jit 编译到机器码的,具体实现上可以有不经过优化的一遍翻译,也可以有多遍的优化编译。可以参考一下 v8 的 https://v8.dev/blog/liftoff
    RobberPhex
        10
    RobberPhex  
       Aug 15, 2022 via Android
    jvm 及其字节码,刚开始大家也觉得性能有问题。
    后来也不流行起来了?
    主要是 wasm 还没有足够大的场景
    nothingistrue
        11
    nothingistrue  
       Aug 15, 2022
    @RobberPhex #10 JVM 的性能可不是靠流行解决的,是随着 JIT 的发展才跟上性能的。但这也就仅限非桌面端,桌面端知道 Eclipse SDT 这些放弃跨平台的组件起来后才跟上来。
    andyskaura
        12
    andyskaura  
       Aug 15, 2022
    nothingistrue
        13
    nothingistrue  
       Aug 15, 2022
    https://developer.mozilla.org/zh-CN/docs/WebAssembly/Concepts

    这里对概念性的东西说得很清楚。这玩意不就是一个安全版的 ActiveX 吗。这样同时在 ARM 和 x86 CPU 运行就跟 Web 或 Javascript 无关了,那是 C/C++ 、Rust 、以及汇编该干的事。从他有文本格式,以及总是标明他是低阶语言来推测,最终运行时很有可能就是汇编语言。这样性能损耗基本是没有的,他说接近原生都是太谦虚了。至于汇编语言的跨平台性这一块,请注意概念里没说跨平台,而是可移植,这就很好操作的,最典型的就是 C++ 那种一份代码多平台编译。实际是怎样就不好说了,WebAssembly 毕竟还是试验性的。
    About     Help     Advertise     Blog     API     FAQ     Solana     3199 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 86ms UTC 13:53 PVG 21:53 LAX 06:53 JFK 09:53
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86