返回

文章详情

C# 现在在 WASM 大小上胜过 Rust

Hacker News2026年10月21日 02:53

独立的 .NET 用于 WebAssembly 和 WASI。编写 C#。部署小型、独立的 Wasm。NetWasm 是一个独立的编译器、CoreLib、运行时和 SDK,直接将 C# 和 .NET CIL 编译为 WebAssembly。它不会将桌面 CLR、Mono、dotnet.js 或应用程序 DLL 带入生产。将 C# 编译为 WebAssembly · 在浏览器中尝试 · 安装并构建 · 查看支持的 API · 阅读文档 C# 现在在 Wasm 大小上胜过 Rust NetWasm 0.8.0 + 精确 GC: 47,798 字节 Rust 1.95.0 大小导向配置文件: 53,635 字节 对于相同的 print-42 工作负载,NetWasm 的结果包括运行时和精确的 Compact 垃圾收集器。两个工件都是独立的 WASI Preview 2 组件,以大小导向的设置构建。原始文件小 10.9%。使用 Brotli-11 小 20.4%。工具链原始 Wasm Brotli 11 比较角色 NetWasm 0.8.0,Compact GC 47,798 B 13,501 B WASI P2 组件;包括精确 GC Rust 1.95.0,大小配置文件 53,635 B 16,963 B 匹配 WASI P2 组件参考 Kotlin 2.4.0 wasmWasi 79,293 B 22,655 B P1 上下文;GC 由宿主引擎提供 TinyGo 0.39.0 93,043 B 26,931 B P1 上下文;配置过的精确 GC Rust 是主要的比较对象,因为它使用相同的工作负载和输出形式。Kotlin/Wasm 和 TinyGo 展示了更广泛的足迹景观,但它们的目标和运行时边界不同。这是一个经过测量的工作负载/配置文件结果,而不是语言范围的大小排名。确切的来源、版本、设置和复现步骤 比 Mono AOT 更快 自 0.10.0 起,NetWasm 在分配和垃圾收集基准测试中比 Mono AOT 跑得更快,后者是从相同的 C# 源代码编译并由相同的 Wasmtime 运行:工作负载 NetWasm 0.10.0,NetWasmGC Mono AOT,.NET 10 NetWasm 时间 全部事务 43.9 毫秒 59.1 毫秒 少 26% 保留对象图 8.8 毫秒 14.2 毫秒 少 38% UI 噪动 17.6 毫秒 29.1 毫秒 少 40% 这些是 15 次运行的中位数,均在 Apple M1 Max 上运行于 Wasmtime 49.0.3,每次运行的结果都与桌面 .NET 的结果进行了检查。Mono AOT 是微软的 wasi-wasm 目标,处于其默认的发布配置中。NetWasmGC 在前两个工作负载 (49.9 毫秒和 9.7 毫秒) 上所需时间也少于桌面 .NET 11 的 JIT;JIT 在 UI 噪动上更快 (8.6 毫秒),桌面 NativeAOT 则在所有三项中速度最快。版本、设置、桌面数据和复现 超越 Hello World 这个 46.7 KiB 的程序是基准,而不是边界。C# 15 · JavaScript 模块和 Web Workers · 静态 .a 互操作 · WIT/WASI P2 · 表达式树 · HTTP/JSON/XML/Regex · 无反射 DI · TUnit/VSTest · wasm64 · 四种分配策略 今天 NetWasm 可以:通过普通的 dotnet CLI 构建、运行、发布和测试项目;将 C# 导出发布为在页面或 Web Worker 中运行的类型化 JavaScript 模块;链接兼容的 Wasm .a 归档并生成有限的 C ABI 调用;从 WIT 生成 C# 绑定并产生独立的 WASI P2 组件;构建和检查没有通用运行时反射的表达式树;使用单独打包的 LINQ、HTTP、JSON、XML、Regex、Hashing 和依赖注入库;为 netwasm0.1 和桌面 .NET 双重目标的库。该配置文件故意比桌面 .NET 小。它已经支持完整的应用程序、便携式库、测试项目和浏览器模块。尝试它 安装 .NET SDK 10.0.303 或更新版本,然后运行: dotnet new install NetWasm.Templates dotnet new netwasm-app -n HelloNetWasm cd HelloNetWasm dotnet restore dotnet run dotnet publish -c Release -o publish/local 使用兼容的 WASI Preview 2 主机(例如 Wasmtime)运行已发布的组件:wasmtime run publish/local/HelloNetWasm.wasm 42 已发布的组件与 .NET 是自包含的。仍需一个 WebAssembly 主机。使用 .NET 构建;不需要 .NET 运行。使用 C# 15 的项目选择 .NET 11 SDK;早期语言版本可以保留在 .NET 10。SDK 通过 NuGet 恢复其固定的 Node、LLD 和 Binaryen 工具,因此普通应用程序不需要单独的 Emscripten、Git 或 Python 安装。请查看完整的快速入门以获取有关主机、恢复、Windows、浏览器和双重目标的详细信息。如何保持小巧 Roslyn 生成 CIL。NetWasm 将可达程序直接编译为 Wasm,专门化其泛型,并仅链接所需的运行时支持。链接的 Wasm 组件就是程序。闭合世界编译。不可达代码、导入和运行时功能不会进入工件中。更小的平台契约。NetWasm 支持可移植 API,而不是重现每个桌面运行时假设。没有广泛的运行时反射。运行时类型名称、动态程序集加载和动态关键字不在配置文件内。生成的边界。JSON、DI、WIT 和原生互操作使用已知契约而不是运行时发现。可选的数据和诊断。时区数据、丰富的堆栈跟踪和其他部署数据仅在选择时包含。一个收集器。仅链接所选的分配策略。这是一个新的 .NET 平台,而不是被挤压到 Wasm 沙箱中的桌面 .NET。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

☕请我喝杯咖啡