
Test yaması Go-nun netip-ində IPv4-ün IPv6-ya çevrilməsində bayt dəyişini ləğv edir
Test tərtibçisinin yenidən yazılması Go-nun netip.AddrFrom16(ip.As16()) nümunəsini daxili sahənin birbaşa kopyasına çevirir və standart kitabxananın 0,88 ns həllə eyni qısa assembly yaradır.
Niyə çevirmə nümunəsi yavaşdır
Go-nun netip.Addr Unmap() metodunu təklif edir, bu IPv4 ilə təsvir edilmiş IPv6 ünvanından təsvir edilməmiş IPv4 ünvanını qaytarır. Əks əməliyyat üçün Map() və ya To6() metodu mövcud deyil. Go saxlayıcıları onu əlavə etməkdə imtina etdilər və istifadəçiləri netip.AddrFrom16(ip.As16())-a yönləndirdilər, ümid edərək ki, tərtibçi bunu optimizasiya edəcək.
Daxildə netip.Addr IP ünvanını 128-bit dəyər kimi saxlayır və ailəsini və zonasını kodlaşdırmaq üçün əlavə sahədən istifadə edir. To6()-ün standart kitabxana tətbiqi IPv4 ünvanları üçün bu sahəni dəyişə bilərdi. Xarici köməkçi isə əksinə, ünvanı 16-bayt massivə çevirməli və geri qaytarmalı idi.
Benchmark nəticələri
Linux-də və AMD Ryzen 5 5600X 6-nüvəli prosessorda işləyən Go 1.27.1 üzrə benchmarklarda standart kitabxananın həlli əməliyyat başına 0,8775 ns sərf etdi. Təhlükəsiz köməkçi 7,137 ns sərf edərkən, eyni daxili vəziyyətə proxy vasitəsilə çatan təhlükəsiz tətbiq 0,8682 ns sərf etdi. Buna görə də köməkçi təxminən səkkiz dəfə yavaş idi.
Standart kitabxananın və təhlükəsiz versiyaların assembly-si demək olar ki, identik idi. Hər ikisi ünvan ailəsini yoxlayırdı və IPv4 emalı zamanı daxili ailə dəyərini dəyişirdi. Təhlükəsiz köməkçi ünvanı 16-bayt massivə yerləşdirdiyi, massivi kopyaladığı və yenidən paketlədiyi üçün daha çox təlimat yaradırdı. Go 1.26.8 ilə tərtibçi bu ardıcıllığı aradan qaldırmırdı.
Tərtibçi mərhələsi eksperimenti
Eksperiment tərtibçinin noding mərhələsində dəqiq netip.AddrFrom16(ip.As16()) nümunəsini yenidən yazır. O, çağırışları netip.Addr strukturu ilə əvəz edir, bu isə orijinal ünvanı kopyalayır və IPv6 ailə dəyərini təyin edir. Yenidən yazma noding zamanı başlamalıdır, çünki daha erken tip yoxlama mərhələsi strukturun ixrac edilməmiş sahələrinə girişi məhdudlaşdırır.
Yamalı quruluş birbaşa tətbiq kimi eyni qısa assembly yaradıdı və testlər net/netip və köməkçi paketi üçün uğurla keçdi. Təhlilə görə, Go saxlayıcıları bu yanaşma ilə razılaşmaq ehtimalı azdır, çünki o, netip.Addr-ın daxili quruluşuna asılıdır və noderə tip yoxlanmış sintaksis ağacınə sədaqətli tərcümə üçün daha çox məsuliyyət yükləyir.
Təklif edilən SSA optimizasiyası
Daha ümumi yanaşma tərtibçinin ümumi SSA mərhələsini, xüsusilə memcombine keçidini hədəfləyir. Təklif edilən yenidən yazma qaydaları yükləmələri yaddaş köçürmələri vasitəsilə yönləndirir, saxlanılan dəyərləri sonrakı yükləmələrə ötürür və bayt dəyişmə əməliyyatları cütünü ləğv edir.
Ünvanın hər 64-bit yarısı üçün bu çevirmələr müvəqqəti massiv, onun nüsxəsi və əlavə yaddaş girişini aradan qaldırır. Yüksək yarısının ötürülməsi həmçinin qonşu, üst-üstə düşən ünvan üzərində saxlama əməliyyati vasitəsilə mümkündür. Sadələşdirmədən sonra hər çıxış yarısı uyğun giriş yarısının nüsxəsinə çevrilir, bu isə ünvan məlumatlarını dəyişməz saxlayır və tələb olunan ailə dəyərini təyin edir.
SiTech — AI ilə gücləndirilmiş veb hazırlanması
Sürətli və müasir saytlar qurur, AI-ı real biznes proseslərinə gətiririk. Layihəniz və ya sualınız var? Kömək etməyə hazırıq.