
קוד Debug שנגזר מ-Rust הוסיף במקרה אחד כ-160KB ל-uv
Rust כיום מוסיף לקוד שנוצר על ידי מספר מאקרו derive הערות inline. במקרה אחד, היישום הגדול של Debug יצר כל כך הרבה קוד חוזר שחוסך, שגודל הקובץ הבינרי של uv יכול היה להקטין בכ-160KB.
הערות inline כתוצאה מ-derive של Rust
מפתחי Rust משתמשים לעיתים קרובות ב-#[derive(...)] כדי לממש טרייטים בסיסיים כמו Debug, Display ו-Clone. המחבר גילה ש-Rust כיום מוסיף כחלק מהגזירות האלו #[inline].
ההתנהגות הזו אינה מובטחת, אבל היא מצוינת בצורה מפורשת בדוגמה של תיעוד המקור ומופיעה בעת פריסת מאקרו. ברוב המקרים הערה שנוצרת רצויה, מכיוון שיישומים נגזרים לרוב קטנים והפיכתם ל-inline עשויה להיות מועילה. התכונה נשארת הערה ולא פקודה.
למה שגיאות מקוננות עשויות להרחיב קוד
יישומים גדולים לא תמיד נהנים מ-inline. היררכיה שכללה שלושה מבני שגיאה ו-enum אחד עם שגיאה יצרה עבור היישומים הנגזרים של Debug כמות משמעותית של קוד. חלק גדול מהקוד הזה יכול היה להפוך ל-inline בכל פעם שנקרא היישום של ה-enum ברמה העליונה.
קריאות כאלה עשויות לחזור על עצמן בעת דיבוג או רישום trace. ההיררכיה בדוגמה תוארה כמפושטת במידה רבה, מכיוון שבאפליקציות Rust אמיתיות לעיתים קרובות מופיעים enum-ים של שגיאות מקוננות עם מספר גדול למדי של שדות. כתוצאה מכך, הקוד שהפך ל-inline עשוי לתפוס חלק משמעותי מהגודל הכולל של קובץ הבינרי של Rust.
הקטנת גודל קובץ הבינרי של uv
המחבר והצוות גילו שניתן היה להקטין את גודל קובץ הבינרי של uv בכ-160KB אם היו מונעים את הפיכת היישום Debug שניתן על ידי rustc ל-inline. התוצאה הייתה בלתי צפויה, מכיוון שעלות הגודל הצטברה במהירות ו-rustc, ככל הנראה, לא הגביל את גודל היישום או את מספר הפעמים שהוא הפך ל-inline.
כדי להשיג את ההקטנה, הצוות הוסיף מאקרו פרוצדורלי משלו שהתנהג כמו derive(Debug), אך השתמש ב-#[inline(never)]. המקרה הזה מראה כיצד הערות inline שנוצרות עשויות להשפיע על גודל קובץ הבינרי כאשר יישום נגזר נחשף דרך מבנה עמוק.
SiTech — פיתוח אתרים בכוח ה-AI
אנחנו בונים אתרים מהירים ומודרניים ומשלבים AI בתהליכי עבודה אמיתיים. יש לכם פרויקט או שאלה? נשמח לעזור.