« Tüm yayınlar

Hata Ayıklama Bilgisi Rust-WebAssembly Derlemesini 40 Kat Yavaşlatıyor

LLVM'in Register Stackify geçişi hata ayıklama kayıtlarını yanlış işliyor; bu da Rust-WebAssembly derlemelerini 40 kata kadar yavaşlatıyor.

Rust kodunu hata ayıklama bilgisiyle (debug = 2) WebAssembly'e derlemek, aynı kodu bu bilgi olmadan derlemekten onlarca kat daha yavaş olabiliyor; bazı durumlarda fark 40 katı aşıyor. Sadece 40 satırlık minimal bir örnek, tam DWARF bilgisi açıldığında derleme süresinin 1,5 saniyeden 50 saniyenin üzerine çıktığını gösteriyor.

Sorunun kökeninde LLVM'in WebAssembly'e özgü 'Register Stackify' geçişi var. Bu geçiş, değerleri wasm operand yığınına taşırken ilgili DBG_VALUE hata ayıklama kayıtlarını da taşımak zorunda kalıyor. WebAssembly bir yığın makinesi olduğu için çok sayıda talimat yeniden konumlandırılıyor; geçiş her seferinde büyüyen bir listeyi yeniden tarıyor ve doğrusal olması gereken iş kareye dönüşüyor. Ayrıca eski kayıtları silmek yerine geride bırakıyor.

Clang için benzer bir LLVM hatası zaten düzeltilmişti, ancak bu düzeltme Rust/WebAssembly senaryosunu tam olarak çözmüyor: birkaç taşımadan sonra bir hata ayıklama kaydı, bloğun daha aşağısında tanımlanan bir yazmaca işaret edebiliyor. Yalnızca ileriye doğru tarama yapan mekanizma bu kaydı hiçbir zaman bulamıyor ve optimizasyon devreye girmiyor.

Daha kapsamlı bir yama, hem ileri hem geri yönlü tarama ekliyor, hata ayıklama kayıtları için gereksiz konum sorgularını atlıyor ve WebAssembly'e özgü daha ucuz bir sıralama kontrolü kullanıyor. Bu sayede örnek üzerinde hash tablosu sorguları 27,4 milyondan 3 milyona düşüyor. WebAssembly hedefleyen Rust geliştiricileri için bu önemli, çünkü profil çıkarma ve hata ayıklama amacıyla debug derlemelere bağımlı kalanların geliştirme döngüsü doğrudan bu sürelerden etkileniyor.

Bu sentez, kaynağından yapay zeka tarafından üretildi; insan editör ya da elle onay adımı yoktur. Nasıl çalışıyoruz