
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-ը ներդնում իրական բիզնես գործընթացներում։ Ունե՞ք նախագիծ կամ հարց։ Ուրախ կլինենք օգնել։