微软的wasm和rust的wasm方案对比

crazylights crazylights     2023-04-30     605

关键词:

微软家的:blazor

技术图片

看图即可见原理。mono.wasm用来构造了一个dotnet解释器。

在blazor被微软收购之前是用的dotnetanywhere,现在换成了mono

然后,直接加载那些dll,执行正经的IL代码。


这个方案,稳健,除了加载容量吓死人

技术图片

这个helloworld,肉眼可见的压缩后容量超过100K的文件就4个。

开发工具 visual studio 2019

开发语言 IL家族

火狐家的rustwasm

技术图片

非常干净,代码直接被编译为wasm执行,没有依赖环境

这个helloworld,wasm 压缩后47k,胶水代码4k

开发工具,命令行工具链rust家族,IDE漂泊不定,vscode可以用

开发语言 rust

来互相伤害一下

先拉个表格

方案对比

微软

Blazor

火狐

RustWasm

blabla
原理把Mono解释器编译为wasm,然后解释执行dotnet dll直接将rust编译为wasm思路完全不同
容量

业务代码14K

解释器 压缩后600k

dotnet基础库 压缩后约800k

业务代码与依赖代码均编译在一起,47K火狐碾压胜
开发语言

dotnet 家族

理论上C# F# VB.net 等,实际上c#为主

rust定位完全不同
开发工具

visual studio 2019

编译、编辑、代码管理一体化

编译工具 rust 工具链和 wasm-pack 工具链

IDE 官方没有,vscode可以用。

微软碾压胜


我对比了四个维度

工作原理

blazor是直接把mono解释器变成了wasm,用户不需要再接触wasm。这个方案有很高的一致性,兼容性极好。用户不需要了解太多wasm,dotnet开发者即可上手。相当于用wasm写了一个脚本语言,然后用户写脚本。

而rust是直接把用户代码编译为wasm。

这是两个截然不同的方案,微软方案存在二次解析和GC,性能会有一定折扣。

容量

blazor的容量惊人,仅解释器和dotnet基础库压缩后就达到了1.5M,不压缩4M多。

仅此一条,将极大的限制blazor的使用场景。

rust在这个项目上碾压胜出

开发语言

c# 作为一门已经有很广泛用户基础的语言,其资料丰富程度是无法抵挡的,外加庞大的c#开发者。

而rust 则是一门致力于为难程序员的语言。

rust是c++的挑战者,他更加底层,尤其是在内存相关的设计上极为复杂。

c#有gc,代码编写比较容易。

对程序员友好度来说,自然是c#更优,但项目?何时轮到程序员的感受了。

rust没有gc,代码就小,也没有gc代价,转换成项目语言就是,rust代码比c#代码快,尤其在wasm环境,微软选了解释器,那就会更快(按照lua的效率预测,lua解释器性能大约是c语言同等逻辑的1/22,这个仅作参考)

开发工具

微软visual studio 2019,目前坊间称为宇宙最强IDE,绝非浪得虚名。

而rust 和 wasm-pack 只有命令行工具

rust IDE,目前体验比较好的,依然是微软家的visual studio code

n

100分 对 60分的差距


调试

微软碾压胜,可以在c#直接下断点,调试wasm环境的代码。


火狐的rust这边,还要靠打log,下断点的方法暂时还没有,希望rust生态的蓬勃发能尽快弥补这个短板。

wasm是支持sourcemap的,目前 wasm-pack工具包居然没有直接生成sourcemap,所以没办法在浏览器环境直接看到rust代码,短板啊。

小结

微软太异端,巨大的依赖容量无法实用化。

rust 还是目前wasm开发的首要选择

Rust 和 Wasm 初始设置

】Rust和Wasm初始设置【英文标题】:Rust&Wasmintitialsetup【发布时间】:2020-12-2914:47:53【问题描述】:我正在关注thistutorial使用rust创建webassembly应用程序,但是当我尝试使用node运行捆绑的web程序集代码时(在添加我自己的任何代... 查看详情

rust语言编写wasm简单例子(代码片段)

rust的wasm使用wasm-pack来build,有很多选项和target用于不同的目的,本文描述一个最简单的示例,不使用webpack和npm,让你可以快速入门和了解。全局安装wasm-packcargoinstallwasm-pack--no-default-features#忽略OpenSSL实例代码extern... 查看详情

如何使用 Wasm 和 Rust 服务多个 HTML 页面?

】如何使用Wasm和Rust服务多个HTML页面?【英文标题】:HowtoservemultipleHTMLpagesusingWasmwithRust?【发布时间】:2020-07-1001:43:17【问题描述】:我正在尝试构建一个在客户端运行wasm的Web应用程序,我想知道什么是服务多个页面的好方法... 查看详情

rust语言编写wasm简单例子(代码片段)

rust的wasm使用wasm-pack来build,有很多选项和target用于不同的目的,本文描述一个最简单的示例,不使用webpack和npm,让你可以快速入门和了解。全局安装wasm-packcargoinstallwasm-pack--no-default-features#忽略OpenSSL实例代码extern... 查看详情

如何使用 Rust 生成最小的 wasm 文件?

】如何使用Rust生成最小的wasm文件?【英文标题】:HowdoIgenerateaminimalwasmfilewithRust?【发布时间】:2018-03-2108:08:23【问题描述】:通过运行emcc-O3-sWASM=1-sSIDE_MODULE=1-osum.wasmsum.c,我可以从以下C代码生成一个相当小的(203字节)wasm文... 查看详情

编译为 Wasm 时,指向堆分配内存的 Rust 指针可以为 0 吗?

】编译为Wasm时,指向堆分配内存的Rust指针可以为0吗?【英文标题】:CanaRustpointertoheap-allocatedmemorybe0whencompiledtoWasm?【发布时间】:2020-09-1411:19:06【问题描述】:在编译成Wasm的Rust代码中进行堆分配内存时,会分配Wasm线性内存中... 查看详情

如何使用 Wasm-Bindgen Web_sys Wasm-pack 将字符串从 Js 传递到通过 Rust 生成的 Wasm

】如何使用Wasm-BindgenWeb_sysWasm-pack将字符串从Js传递到通过Rust生成的Wasm【英文标题】:HowtoPassaStringfromJstoWasmgeneratedthroughRustusingWasm-BindgenWeb_sysWasm-pack【发布时间】:2020-09-1104:16:01【问题描述】:代码是基本的,我从js调用一个函... 查看详情

全栈程序员的新玩具rust第一个wasm程序

先上代码https://gitee.com/lightsever/rust_study/tree/master/wasm_hello01 webassembly就不用再赘述了,耳朵里面快磨出茧子来了。rustwasm是火狐自家的玩具,让我们来继续做实验,让rust飞起来吧。环境安装安装好rust环境之后仍然需要一个wasm... 查看详情

如何通过 wasm-pack 将 Rust Wasm 应用程序与 libpq 链接?

】如何通过wasm-pack将RustWasm应用程序与libpq链接?【英文标题】:HowcanIlinkaRustWasmapplicationwithlibpqviawasm-pack?【发布时间】:2020-02-2900:57:30【问题描述】:我正在尝试创建一个带有Wasm数据库层的NodeJS应用程序。我使用Rust、Diesel作为... 查看详情

从 Rust 为机器类型 wasm32 构建 LLVM

】从Rust为机器类型wasm32构建LLVM【英文标题】:BuildLLVMfromRustformachinetypewasm32【发布时间】:2020-02-1311:11:40【问题描述】:我正在尝试构建一个爱好项目,在其中我将Rust文件构建到WebAssembly。我想将更多选项传递给emscripten,然后Ru... 查看详情

原创来玩儿!rust+wasm开发的一个方便实用的大会海报工具

先来一张图镇楼:是不是很实用!!!此工具由专注于wasm 生态的SecondState提供。生成的海报可用于朋友圈等渠道传播不过,仅供娱乐哈!对专业运营团队可能很有用!还等什么,大家一起来玩玩儿吧!!​​https://second-state.... 查看详情

ewasm项目初探

...好开发合约更容易,支持更多语言和工具ewasm项目目标和方案以太坊ewasm项目目标是既要完成对wasm的支持,又要兼容EVM1.0合约。要达到这个目标,ewasm目前的 查看详情

认识webassembly与rust实践(代码片段)

...题时的优化手段和思路。简介先来说下在WebAssembly(后续称WASM)官网上的介绍,主要有四点:高效:WASM有一套完整的语义,实际上WASM是体积小且加载快的二进制格式,其目标就是充分发挥硬件的能力以达到原生... 查看详情

波卡与wasm合约双剑合璧

...:同样受限于初级语言Solidity的表达能力和运行效率。3.Wasm合约:使用链级别的高级语言Rust或AS开发,部署和运行成本都很低。01Substrate链开发:底层技术创新的温床如果用Sub 查看详情

webassembly(wasm)和云原生|wasm和区块链

文章目录一、什么是Wasm、WASI二、WebAssembly(WASM)和云原生WebAssembly能不能取代Docker三、Wasmcontainer与Kubernetes四、云原生、WASM和边缘计算为边缘优化的WebAssembly虚拟机:wasmedge五、wasm和区块链Wasm对于EVM有什么优势?虚拟机之战࿱... 查看详情

使用 wasm-bindgen 对大型 rust 对象进行 Js 绑定

】使用wasm-bindgen对大型rust对象进行Js绑定【英文标题】:Jsbindingforlargerustobjectusingwasm-bindgen【发布时间】:2021-03-2208:05:21【问题描述】:我想写一个显示大二进制文件内容的vscode扩展,用bincode写的:#[macro_use]externcrateserde_derive;use... 查看详情

在.net7上使用wasm和wasi

WebAssembly(WASM)和WebAssemblySystemInterface(WASI)为开发人员开辟了新的世界。.NET开发人员在BlazorWebAssembly发布时熟悉了WASM。BlazorWebAssembly在浏览器中基于WebAssembly的.NET运行时上运行客户端。WASI通过提供一个系统接口... 查看详情

如何使用 Emscripten 编译的程序中的 wasm-bindgen?

】如何使用Emscripten编译的程序中的wasm-bindgen?【英文标题】:HowcanIusewasm-bindgenfromaprogramcompiledwithEmscripten?【发布时间】:2022-01-2319:07:24【问题描述】:我正在尝试将包含由wasm-bindgen生成的代码的Rust库与我想用Emscripten编译的用C... 查看详情