NetWasm: C# giờ đây vượt Rust về kích thước tệp WebAssembly

Công nghệ21 tháng 10, 2026·6 phút đọc

Dự án NetWasm 0.8.0 giới thiệu trình biên dịch .NET độc lập cho WebAssembly/WASI, tạo ra tệp Wasm chỉ 47.798 byte — nhỏ hơn 10,9% so với Rust 1.95.0 ở cùng bài toán in số 42, và nhỏ hơn 20,4% khi nén Brotli. Đây là bước tiến đáng chú ý với cộng đồng .NET, vốn thường bị coi là nền tảng cồng kềnh khi chạy trên trình duyệt.

NetWasm: C# giờ đây vượt Rust về kích thước tệp WebAssembly

NetWasm: C# giờ đây vượt Rust về kích thước tệp WebAssembly

Trong thế giới WebAssembly, Rust từ lâu đã được xem là "vua" về kích thước tệp nhỏ gọn. Nhưng một dự án mã nguồn mở mang tên NetWasm vừa đưa ra thách thức trực tiếp: với cùng một bài toán in số 42, chương trình viết bằng C# biên dịch qua NetWasm chỉ tốn 47.798 byte, trong khi Rust 1.95.0 với cấu hình tối ưu kích thước cần tới 53.635 byte.

Huy hiệu GitHub Stars của NetWasmHuy hiệu GitHub Stars của NetWasm

NetWasm là gì?

NetWasm là một bộ trình biên dịch, CoreLib, runtime và SDK độc lập dành cho .NET trên WebAssembly và WASI. Điểm khác biệt cốt lõi: nó biên dịch trực tiếp mã C# và .NET CIL sang WebAssembly, chứ không mang theo CLR desktop, Mono, dotnet.js hay các DLL của ứng dụng vào môi trường production.

Nói cách khác, các lập trình viên C# có thể làm việc như bình thường với CLI quen thuộc của .NET, nhưng sản phẩm đầu ra là một thành phần Wasm tự chứa, độc lập và nhỏ gọn. Triết lý ở đây rất rõ: biên dịch với .NET, nhưng chạy mà không cần .NET.

Con số biết nói

Kết quả đo đạc của NetWasm 0.8.0 (với bộ thu gom rác Compact) so với các toolchain phổ biến:

  • NetWasm 0.8.0, Compact GC: 47.798 B thô — 13.501 B sau nén Brotli 11
  • Rust 1.95.0, cấu hình tối ưu kích thước: 53.635 B thô — 16.963 B sau nén Brotli 11
  • Kotlin 2.4.0 wasmWasi: 79.293 B thô — 22.655 B sau nén
  • TinyGo 0.39.0: 93.043 B thô — 26.931 B sau nén

Như vậy NetWasm nhỏ hơn Rust 10,9% ở kích thước thô và 20,4% sau khi nén Brotli. Đáng chú ý là kết quả của NetWasm đã bao gồm cả runtime và bộ thu gom rác chính xác (precise GC), trong khi đây đều là các thành phần WASI Preview 2 Component độc lập được xây dựng với cấu hình tối ưu kích thước.

Trạng thái quy trình phát hành NetWasmTrạng thái quy trình phát hành NetWasm

Cần lưu ý: các so sánh với Kotlin/Wasm và TinyGo chỉ mang tính minh họa cho bức tranh tổng thể, vì mục tiêu và ranh giới runtime của chúng khác nhau. Đây là kết quả đo trên một bài toán cụ thể, không phải bảng xếp hạng kích thước cho toàn bộ ngôn ngữ.

Hiệu năng: vượt cả Mono AOT

Không chỉ nhỏ, NetWasm còn nhanh. Từ phiên bản 0.10.0, dự án công bố các benchmark cấp phát bộ nhớ và thu gom rác chạy nhanh hơn Mono AOT – cùng mã nguồn C#, cùng chạy trên Wasmtime:

  • Giao dịch đầy đủ: 43,9 ms so với 59,1 ms (nhanh hơn 26%)
  • Đồ thị đối tượng được giữ lại: 8,8 ms so với 14,2 ms (nhanh hơn 38%)
  • UI churn: 17,6 ms so với 29,1 ms (nhanh hơn 40%)

Các số liệu là trung vị của 15 lần chạy trên Apple M1 Max với Wasmtime 49.0.3. Thú vị hơn, NetWasmGC còn nhanh hơn cả JIT của .NET 11 desktop ở hai bài toán đầu tiên.

Vì sao NetWasm giữ được kích thước nhỏ?

Bí quyết nằm ở cách NetWasm tiếp cận bài toán:

  • Biên dịch closed-world: mã không thể tiếp cận, import và tính năng runtime không cần thiết sẽ không lọt vào sản phẩm cuối.
  • Hợp đồng nền tảng tối giản: hỗ trợ API di động thay vì tái tạo mọi giả định của runtime desktop.
  • Không reflection toàn diện: tên kiểu runtime, nạp assembly động và từ khóa dynamic nằm ngoài profile hỗ trợ.
  • Ranh giới được sinh tự động: JSON, DI, WIT và interop gốc dùng hợp đồng biết trước thay vì khám phá lúc chạy.
  • Một bộ thu gom rác duy nhất: chỉ chiến lược cấp phát được chọn mới được liên kết vào.

Đây là một nền tảng .NET mới, chứ không phải .NET desktop bị nhồi vào hộp cát Wasm. Chính ranh giới rõ ràng đó tạo nên khả năng có kích thước ngang ngửa Wasm gốc.

Kích thước các chiến lược cấp phát bộ nhớ của NetWasmKích thước các chiến lược cấp phát bộ nhớ của NetWasm

So với Blazor WebAssembly thì sao?

Đây có lẽ là con số gây sốc nhất. Với một ứng dụng Blazor WebAssembly giao diện rỗng, cũng in số 42, bật AOT, trimming, IL stripping và native linking tối ưu kích thước:

  • NetWasm 0.8.0: 47.798 B
  • Blazor WebAssembly .NET 10: 12.276.684 B (gấp 257 lần)
  • Blazor WebAssembly .NET 11 RC1: 15.289.241 B (gấp 320 lần)

Tất nhiên, đây là so sánh giữa một component console và một ứng dụng giao diện rỗng – không phải so sánh tương đương về framework. Nhưng khoảng cách hàng trăm lần vẫn cho thấy tiềm năng to lớn của hướng tiếp cận mới.

Lộ trình tới phiên bản 1.0

NetWasm hiện đang ở giai đoạn trước 1.0. Profile hỗ trợ đã dùng được trong thực tế, nhưng các hợp đồng về mã nguồn, package, target-profile và ABI có thể thay đổi giữa các bản minor.

Những hạn chế hiện tại cần lưu ý:

  • Chưa hỗ trợ reflection runtime toàn diện, dynamic, nạp assembly động và đa luồng managed.
  • Chưa có System.IO.File/Directory/FileStream đầy đủ, socket thô và API tiến trình con.
  • Các package NuGet hiện có chỉ hoạt động khi mã và phụ thuộc API phù hợp với profile hỗ trợ.

Mục tiêu 1.0 tập trung vào: mở rộng độ phủ WASI Preview 2, chế độ toàn cầu hóa và dữ liệu văn hóa tùy chọn, hoàn thiện expression tree, vòng lặp phát triển tăng dần nhanh hơn, và hợp đồng nền tảng netwasm1.0 ổn định.

Về giấy phép, CoreLib, thư viện runtime và template dùng MIT, trình biên dịch và công cụ dùng NetWasm Community License 1.0 – miễn phí cho cá nhân đủ điều kiện, giáo dục, mã nguồn mở và tổ chức dưới 250 nhân viên với doanh thu dưới 10 triệu USD.

Ý nghĩa với cộng đồng lập trình viên Việt Nam

Với các đội ngũ .NET tại Việt Nam – vốn phổ biến trong môi trường doanh nghiệp và gia công phần mềm – NetWasm mở ra một hướng đi mới: tận dụng kỹ năng C# sẵn có để xây dựng các module chạy trên trình duyệt hoặc môi trường serverless với kích thước tối giản. Điều này đặc biệt hữu ích cho các ứng dụng cần edge computing, sandbox bảo mật hoặc nhúng vào hệ thống plugin.

NetWasm không phải là "desktop .NET nhưng trên Wasm". Đó là một nền tảng nhỏ hơn, ổn định hơn và có tài liệu đầy đủ – ranh giới rõ ràng chính là thứ khiến C# có thể đạt kích thước ngang Wasm gốc.

Dự án vẫn đang mời cộng đồng đóng góp các workload thực tế để định hình ranh giới hỗ trợ cho phiên bản 1.0. Nếu bạn quan tâm, có thể bắt đầu chỉ với một lệnh dotnet new netwasm-app và dòng Console.WriteLine(42) quen thuộc.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗