Saf Fonksiyonel Programlama C Performansına Ne Kadar Yaklaşabilir?
Kaynak: Hacker News
İçindekiler 2 başlık
Fonksiyonel programlama (FP) dilleri genellikle yüksek soyutlama yetenekleri ve güvenli yapılarıyla bilinirken, saf çalışma zamanı performansı söz konusu olduğunda C ve Rust gibi sistem dillerinin gerisinde kaldıkları düşünülür. Ancak güncel derleyici teknolojileri ve dil tasarımları bu algıyı kökten değiştiriyor.
Yakın zamanda yayımlanan "Why Lean is Faster Than Rust" başlıklı makalede etkileyici bir sonuç paylaşıldı: Bir fonksiyonel programlama dili ve kanıt asistanı olan Lean 4 ile yazılmış bir DEFLATE sıkıştırma kütüphanesi (lean-zip), crates.io üzerinde bir milyardan fazla kez indirilen eşdeğer Rust paketini (miniz_oxide) geride bıraktı. Makaledeki verilere göre lean-zip, miniz_oxide'ın sunduğu her sıkıştırma seviyesini aşarak aynı sıkıştırmayı daha yüksek verimle sağlıyor; en hızlı ayarda %15 daha hızlı çalışıyor ve %8,8 daha küçük çıktı üretiyor.
Buna rağmen lean-zip, DEFLATE performansının zirvesi kabul edilen ve C ile yazılmış olan libdeflate karşısında aynı üstünlüğü gösteremedi. Mimariye özgü SIMD komutlarıyla son derece dikkatli optimize edilmiş olan libdeflate, Lean'in erişemediği düşük seviyeli optimizasyonlar sayesinde farkını korudu.
Tam bu noktada devreye Roc giriyor. Roc, bir teorem kanıtlayıcı olmayan ancak çalışma zamanı (runtime) performansına açıkça odaklanan saf bir fonksiyonel programlama dilidir. Sloganı "Hızlı, Kullanıcı Dostu, Fonksiyonel" (Fast, Friendly, Functional) olan dilde hem hızlı çalışmak hem de hızlı derlenmek temel hedeftir. Henüz ilk numaralı sürümü olan 0.1.0'dan haftalar uzakta olmasına ve yeni filizlenen paket ekosisteminde neredeyse hiç optimizasyon çalışması yapılmamış olmasına rağmen; dil tasarımı, köklü optimizasyonları ve yepyeni derleyici uygulaması sayesinde C dünyasının şampiyonu libdeflate'e meydan okuyabilecek bir temele sahip.
Yazar, Niclas Ahden tarafından geliştirilen ve üretim ortamında kullanılan roc-deflate paketi üzerinde yoğun performans optimizasyonları gerçekleştirdi. Klasik Silesia korpusu kullanılarak yapılan ve birebir aynı çıktıların üretildiğini doğrulayan akışsız (non-streaming) API testlerinde amaç, libdeflate performansına ne kadar yaklaşılabileceğini görmekti.
%10'dan Daha Az Yavaş#
2021 M1 MacBook Pro ve x64 karşılaştırması için AMD Ryzen 9 3900X Ubuntu makinede L1'den L12'ye kadar olan sıkıştırma seviyelerinde yapılan 144 kıyaslama (benchmark) sonucunda ortaya çıkan tablo oldukça çarpıcıdır:
- M1 MacBook Pro:
roc-deflate, ortanca (median) durumdalibdeflate'ten yalnızca %2,6 daha yavaş çalıştı. - AMD Ryzen 9 3900X (Ubuntu): Ortanca durumda
libdeflate'ten sadece %8,9 daha yavaş bir performans sergiledi. - Silesia Korpusu L1 Performans Örnekleri:
libdeflate, 15 çalıştırmanın ortancasına göre L1 seviyesindedickensdosyasında 230.57 MB/s,mozilla'da 248.31 MB/s,mr'da 312.26 MB/s,nci'da 601.03 MB/s,ooffice'de 169.98 MB/s,osdb'de 284.01 MB/s,reymont'ta 281.14 MB/s,samba'da 344.00 MB/s,sao'da 160.21 MB/s vewebster'da 268.58 MB/s hızlarına ulaşırken,roc-deflatebu değerleri çok yakın bir marjla takip etmeyi başardı.
Yazılım Geliştiriciler İçin Pratik Çıkarımlar#
- Soyutlama ve Performans İkilemi Azalıyor: Doğru derleyici mimarisi ve bellek yönetimiyle, saf fonksiyonel diller C seviyesindeki performansa tek haneli yüzdeler kadar yaklaşabilmektedir.
- Erken Aşama Potansiyeli: Henüz
0.1.0sürümüne bile ulaşmamış bir dilin, yıllarca SIMD ile ince ayar yapılmış bir C kütüphanesine %2,6 ila %8,9 kadar yaklaşması, modern derleyici tasarımının gücünü kanıtlar. - Doğrulama Odaklı Optimizasyon: Performans iyileştirmeleri yapılırken standart veri setleri (Silesia korpusu gibi) kullanmak ve çıktıların birebir aynı olduğunu doğrulamak, güvenilir yazılım mühendisliğinin temelidir.
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:
- rtfeldman.com/fp-vs-c