Վերադառնալ
Rust-ի գեներոված Debug կոդը մեկ դեպքում uv-ին ավելացրել է մոտ 160KB
SiTech AI Team2 րոպե ընթերցում

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 հուշումները ազդել բինարի չափի վրա, երբ գեներոված իմպլեմենտացիան օգտագործվում է խորը ներդրված տիպի շնորհիվ:

SSiTech

SiTech — AI-ով հզորացված վեբ մշակում

Ստեղծում ենք արագ ու ժամանակակից կայքեր և AI-ը ներդնում իրական բիզնես գործընթացներում։ Ունե՞ք նախագիծ կամ հարց։ Ուրախ կլինենք օգնել։