İçeriğe geç
edumintsBlog
Backend3 dk okuma

C# Artık WASM Boyutunda Rust'ı Geride Bırakıyor

Kaynak: Hacker News

Paylaş
BackendEdumints Blog
İçindekiler 3 başlık

NetWasm: WebAssembly ve WASI İçin Bağımsız .NET#

NetWasm, C# ve .NET CIL kodlarını doğrudan küçük ve bağımsız WebAssembly (Wasm) çıktılarına derleyen bağımsız bir derleyici, CoreLib, çalışma zamanı (runtime) ve SDK çözümüdür. Geleneksel yaklaşımların aksine üretim ortamına masaüstü CLR, Mono, dotnet.js veya uygulama DLL dosyalarını taşımaz. Bu mimari tercih, bulut tabanlı mikroservisler, sunucusuz (serverless) fonksiyonlar ve uç (edge) bilişim senaryoları geliştiren yazılımcılar için başlangıç sürelerini ve dağıtım paketlerini radikal biçimde küçültme fırsatı sunar.

WASM Boyutunda C# Artık Rust'ı Geçiyor#

Aynı "42 yazdırma" (print-42) iş yükünde ve boyut odaklı WASI Preview 2 Bileşeni ayarlarında NetWasm, çalışma zamanı ve hassas (precise) Compact Garbage Collector (GC) dahil olmasına rağmen Rust'tan daha küçük çıktılar üretmektedir. Ham boyutta %10,7, Brotli-11 sıkıştırmasıyla ise %19,5 daha küçüktür:

  • NetWasm (Compact GC): 47.895 B ham Wasm, 13.660 B Brotli-11 (WASI P2 Bileşeni; hassas GC dahil)
  • Rust 1.95.0 (Boyut profili): 53.635 B ham Wasm, 16.963 B Brotli-11 (Eşleştirilmiş WASI P2 Bileşeni referansı)
  • Kotlin 2.4.0 (wasmWasi): 79.293 B ham Wasm, 22.655 B Brotli-11 (P1 bağlamı; GC ana motor tarafından sağlanır)
  • TinyGo 0.39.0: 93.043 B ham Wasm, 26.931 B Brotli-11 (P1 bağlamı; hassas GC yapılandırılmış)

Burada Rust, aynı iş yükü ve çıktı biçimini kullandığı için ana karşılaştırma noktasıdır. Kotlin/Wasm ve TinyGo genel ayak izi tablosunu gösterse de hedefleri ve çalışma zamanı sınırları farklıdır. Yazılım mühendisliği perspektifinden bakıldığında bu sonuç, genel bir dil sıralaması değil ölçülü bir iş yükü/profil başarısıdır; ancak yönetimli (managed) ve çöp toplayıcılı bir dilin bile doğru AOT (Ahead-of-Time) tasarımıyla sistem dilleriyle boyut açısından yarışabileceğini kanıtlar.

Mono AOT'den Daha Hızlı Performans#

Apple M1 Max üzerinde Wasmtime 49.0.3 ile yapılan 15 çalıştırmanın medyan sonuçlarına göre NetWasm, aynı C# kaynak kodundan derlenen bellek tahsisi (allocation) ve çöp toplama (GC) testlerinde Microsoft'un varsayılan Release yapılandırmasındaki Mono AOT (wasi-wasm hedefi) çözümünden belirgin şekilde daha hızlıdır:

  • Tam işlem (Full transaction): NetWasm ile 43,9 ms iken Mono AOT (.NET 10) ile 59,1 ms (%26 daha az süre)
  • Korunan nesne grafiği (Retained object graph): NetWasm ile 8,8 ms iken Mono AOT (.NET 10) ile 14,2 ms (%38 daha az süre)
  • UI değişimi (UI churn): NetWasm ile 17,6 ms iken Mono AOT (.NET 10) ile 29,1 ms (%40 daha az süre)

Ayrıca NetWasmGC, ilk iki iş yükünde masaüstü .NET 11 JIT derleyicisinden (sırasıyla 49,9 ms ve 9,7 ms) bile daha az zaman harcamaktadır; yalnızca UI değişiminde JIT (8,6 ms) daha hızlı kalmaktadır. Geliştiriciler için buradaki en önemli pratik çıkarım, hedef platforma (WASI/Wasm) özel optimize edilmiş bir çalışma zamanı ve GC tasarımının hem dosya boyutunda hem de çalışma hızında geleneksel genel amaçlı araç zincirlerine kıyasla ciddi verimlilik sağlamasıdır.

Kaynak ve atıf

Bu yazı, Hacker News üzerinde yayımlanan içerikten yararlanılarak Edumints tarafından yapay zekâ desteğiyle Türkçe hazırlandı. Ayrıntılar ve yazarların kendi anlatımı için orijinaline bakabilirsin:

  • github.com/zion-sati/NetWasm