Kod hızını artırma: AMD64'te 16 bayttan büyük struct'lar geçirmeyin
- Neat dilinin performansını artırmak için, bir diziyi tek bir struct parametresi yerine üç pointer parametresi olarak geçirecek şekilde değişiklik yapıldı.
- Neat dizilerinin D dilindeki dizilerden daha yavaş olmasının nedeni, 24 baytlık dizi boyutunun 16 baytı aşması ve bu yüzden parametrelerin farklı bir yöntemle geçirilmesidir.
- SystemV AMD64 ABI belirtimine göre, 16 baytı aşan tüm struct'lar pointer üzerinden geçirilir.
Benchmark ile sorunun doğrulanması
- Benchmark ile, struct geçirme yöntemi ile ayrı alanları geçirme yöntemi arasındaki performans farkı doğrulandı.
- Struct geçirildiğinde stack üzerinde ayırma ve kopyalama süreci gerekirken, ayrı alanlar geçirildiğinde bunlar doğrudan SSE register'ları üzerinden iletilir.
- Ayrı alanları geçirme yöntemi, struct geçirme yöntemine kıyasla yaklaşık 2 kat daha hızlı performans gösterdi.
Dil tasarımcısının seçimi
- C API çağrılırken C ABI'ye uyulması gerekir, ancak dahili olarak kullanılan yüksek seviyeli tiplerin struct olarak ifade edilmesi gerekmez.
- Dil tasarımcısı; dizilerin, tuple'ların ve sum type'ların nasıl geçirileceğine karar verebilir.
- 16 baytı aşan tipleri ayrı alanlar olarak geçirmek, performans artışına yardımcı olabilir.
GN⁺ görüşü
- Bu yazı, yazılım optimizasyonuyla ilgilenen geliştiriciler için oldukça faydalı.
- Özellikle performansa duyarlı uygulamalar geliştirirken, struct boyutunun ve geçirme yönteminin önemli etkiler yaratabileceğini gösteriyor.
- Dil tasarımcıları veya API geliştiricileri, bu bilgiyi performansı iyileştirme fırsatı olarak kullanabilir.
1 yorum
Hacker News yorumu
struct Vectorparametre türüconst struct Vector &referansı olarak geçirilecek şekilde değiştirilebilir. Pointer bug’larının bulunduğu pek çok C++ kodunda pointer’lar gereksiz yere kullanılmıştı; referansla geçirmek hem daha kolay hem de daha güvenli kullanılabilirdi.