C#이 WebAssembly에서 Rust 꺾고 최소 용량 달성
원제 C# now beats Rust on WASM size
138 포인트댓글 75
Key Point
WebAssembly 배포 시 C#이 Rust보다 더 작은 바이너리를 생성할 수 있으며, 기존 Blazor의 256배 크기 문제를 획기적으로 개선한다.
핵심 요약
- NetWasm은 C# 코드를 WebAssembly로 직접 컴파일하는 독립형 컴파일러, 런타임, SDK로, 데스크톱 CLR이나 Mono를 포함하지 않는다.
- 같은 작업(42 출력)을 기준으로 NetWasm은 47,895바이트, Rust 1.95.0 크기 최적화 프로필은 53,635바이트로, NetWasm이 10.7% 더 작고 Brotli-11 압축 후 19.5% 더 작다.
- 두 결과 모두 WASI Preview 2 Component 형태의 독립형 바이너리이며 각 도구의 표준 빌드 방식을 사용하며, NetWasm 수치는 정확한 가비지 컬렉터를 포함한다.
- Kotlin 2.4.0 wasmWasi는 79,293바이트, TinyGo 0.39.0은 93,043바이트로 더 크며, 이는 단일 워크로드 결과이지 언어별 크기 순위가 아니다.
- NetWasm은 Mono AOT보다 가비지 컬렉션 벤치마크에서 26~40% 빠르며, 메모리 할당 및 추적 시 Apple M1 Max에서 Wasmtime 49.0.3 기준으로 측정했다.
- NetWasm은 C# 15, JavaScript 모듈 웹 워커, WIT/WASI P2 바인딩, HTTP/JSON/XML/정규식, 의존성 주입 등을 지원하며 dotnet CLI로 프로젝트를 빌드·테스트·배포할 수 있다.
- 작은 바이너리를 유지하기 위해 도달 불가능한 코드를 제외하는 폐쇄 세계 컴파일, 제한된 런타임 반사, 생성된 경계(JSON, DI, 네이티브 상호운용), 선택적 시간대 데이터를 적용한다.
- 기본 Compact 할당 전략은 작은 애플리케이션용이며, NetWasmGC는 높은 할당 처리량, Bump는 단일 작업용이고, 전략은 프로젝트의 .csproj에서 선택할 수 있다.
- 빈 Blazor WebAssembly 애플리케이션(42 출력)과 비교하면, NetWasm은 47,895바이트인 반면 Blazor .NET 10은 12,276,684바이트(256배 크고, .NET 11 RC1은 319배 크다.
- NetWasm은 pre-1.0 상태로 WASI Preview 2 Component를 표준 출력으로 하며, 런타임 반사, dynamic, 관리 스레딩, System.IO.File/Directory, 원본 소켓은 지원하지 않는다.
- 0.10.0 버전에서 가비지 컬렉터를 재구축했으며, 객체는 컬렉터 헤더를 포함하지 않고, 배열은 단일 할당이며, Compact는 크기와 메모리 최적화를 위해 새로 개발했다.
- 라이선스는 CoreLib 및 라이브러리는 MIT, 컴파일러는 NetWasm Community License 1.0이며, 개인, 교육, 오픈소스, 250명 미만 직원 또는 연간 매출 1천만 달러 미만 조직은 무료다.
- 로드맵에는 WASI Preview 2 범위 확대, 지역화 모드 및 선택적 문화 데이터, 표현 트리 완성, 증분 개발 루프 가속화, 안정적인 netwasm1.0 플랫폼이 포함되어 있다.