
Rust-ის წარმოებულმა Debug კოდმა ერთ შემთხვევაში uv-ს დაახლოებით 160KB შემატა
Rust ახლა inline მინიშნებებს ამატებს რამდენიმე derive მაკროს მიერ გენერირებულ კოდს. ერთ შემთხვევაში, Debug-ის დიდი იმპლემენტაციის გამო დაგროვილი გამეორებული კოდი საკმარისი აღმოჩნდა, რომ uv-ის პროექტს დაახლოებით 160KB შეემცირებინა.
Inline მინიშნებები Rust-ის derive-ის შედეგში
Rust-ის დეველოპერები ხშირად იყენებენ #[derive]-ს, რომ განახორციელონ ისეთი ძირითადი trait-ები, როგორიცაა Debug, Display და Clone. ავტორმა აღმოაჩინა, რომ Rust ამჟამად ამ derive-ების დროს #[inline]-ს გამოიმუშავებს.
ეს ქცევა გარანტირებული არ არის, თუმცა მას რეფერენსში მოცემული მაგალითი გულისხმობს და ის მაკროების გაშლისას ჩნდება. უმეტეს შემთხვევაში გენერირებული მინიშნება სასურველია, რადგან წარმოებული იმპლემენტაციები ხშირად მცირეა და მათთვის inline-ში გაშლა სარგებელს მოიტანს. ატრიბუტი მაინც მინიშნებად რჩება და არა ბრძანებად.
რატომ ზრდიან ბუდობრივი შეცდომები კოდს
დიდი იმპლემენტაციები ყოველთვის არ იღებენ სარგებელს inline-ში გაშლისგან. სამი შეცდომის სტრუქტურისა და ერთი შეცდომის enum-ის შემცველმა იერარქიამ მათი წარმოებული Debug იმპლემენტაციებისთვის მნიშვნელოვანი მოცულობის კოდი გამოიმუშავა. ამ კოდის დიდი ნაწილი inline-ად შეიძლებოდა გაშლილიყო ყოველ ჯერზე, როცა ზედა დონის enum-ის იმპლემენტაცია გამოიძახებოდა.
ასეთი გამოძახებები შეიძლება არაერთხელ მოხდეს debug ან trace ლოგირებისას. მაგალითში მოცემული იერარქია მკვეთრად გამარტივებულად იყო აღწერილი, რადგან რეალურ Rust აპლიკაციებში ხშირად გვხვდება ღრმად ჩადგმული შეცდომის enum-ები ველების არამცირე რაოდენობით. შედეგად მიღებული inline კოდი შეიძლება Rust-ის ბინარის მთლიანი ზომის არამცირე ნაწილს წარმოადგენდეს.
uv-ის ბინარის ზომის შემცირება
ავტორმა და გუნდმა დაადგინეს, რომ uv-ის ბინარი დაახლოებით 160KB-ით შეეძლოთ შეემცირებინათ, თუ rustc-ს კონკრეტული Debug იმპლემენტაციის inline-ად გაშლის უფლებას არ მისცემდნენ. შედეგი მოულოდნელი იყო, რადგან ზომის ხარჯი სწრაფად გროვდებოდა და rustc, როგორც ჩანს, არ ზღუდავდა არც იმპლემენტაციის ზომას და არც იმას, რამდენჯერ გაშლილიყო ის inline-ად.
შემცირების მისაღწევად გუნდმა დაამატა საკუთარი პროცედურული მაკრო, რომელიც derive(Debug)-ივით იქცეოდა, მაგრამ იყენებდა #[inline(never)]-ს. ეს შემთხვევა აჩვენებს, თუ როგორ შეიძლება გენერირებულმა inline მინიშნებებმა გავლენა მოახდინონ ბინარის ზომაზე, როცა წარმოებული იმპლემენტაცია ღრმად ჩადგმული ტიპის გავლით გამოიყენება.
SiTech — AI-გაძლიერებული ვებ დეველოპმენტი
ვქმნით სწრაფ, თანამედროვე ვებსაიტებს და AI-ს ვაერთიანებთ ქართული ბიზნესებისთვის. გაქვთ პროექტი ან კითხვა? სიამოვნებით დაგეხმარებით.