אופטימיזציה - הקטנת נפח הקוד

הקטנת נפח הזיכרון הדרוש לאחסון הקוד (”התוכנית”) של יישום כלשהו, היא תמיד מטרה ראויה. נפח הזיכרון המוקצב עבור התוכנה של המיקרובקר, עומד על כמה עשרות קילו-בייט במקרה הטוב, ועל קילו-בייט בודדים ברוב המקרים. לפיכך, צמצום “טביעת הרגל” של הקוד בזכרון (Memory footprint), הוא לא רק “יעד שכדאי לעמוד בו”, אלא במקרים רבים זהו כורח המציאות.

 

הרשימה להלן תפרט מספר שיטות נפוצות, שיאפשרו למתכנת להקטין את נפח הקוד הסופי. אם הקוד מומש מלכתחילה, תוך שימת-לב לאופטימיזציית (מיטוב) נפח הקוד, השיפור יהיה מזערי. אך אם הקוד נכתב מתוך רצון שתחילה יבצע את הנדרש, ורק בהמשך תבוצע לו אופטימיזציה (שיטת פיתוח שנפוצה בהרבה מימושים), יש סיכוי טוב שאם תשתמשו ברעיונות המוצגים, נפח הקוד יקטן באופן ניכר.

 

שיטות לצמצום נפח הקוד

  • עיברו בקפידה על כל הקוד, חפשו “קוד מיותר” ותסירו אותו. לדוגמא: קטעי קוד שהוספו רק לצורך Debug, או לצורך בדיקת-יחידה (Unit test). כמעט תמיד ניתן למצוא קוד מיותר, בעיקר אם זו הפעם הראשונה, שאתם מבצעים חיפוש שכזה.
  • אתרו קטעי קוד שחוזרים על עצמם, היפכו אותם לפונקציה וקראו לה מכל המקומות הרלבנטיים. מחקו את המופעים המיותרים של הקוד.
  • בידקו אם לקומפיילר שלכם יש אפשרות לאופטימיזציה של נפח הקוד, תפעילו אותה וקמפלו מחדש. לפעמים הקומפיילר יצליח להקטין את הקוד, ולפעמים נפח הקוד עשוי לגדול במעט. הכל תלוי באיכות אלגוריתם האופטימיזציה של הקומפיילר.
  • חפשו מקומות בקוד, שניתן לכתוב מחדש, תוך שימוש בפחות מקום בזיכרון. לדוגמא: אם יש לכם משתנה כלשהו שערכו ההתחלתי 1, ולאורך הקוד הוא מקבל את הערכים 2,4,8,16,32,64,128 לפי הסדר, אפשר למחוק את הקוד שמטפל בטעינת הערכים המתאימים אל המשתנה ובמקומו, להוסיף פקודה ש”מזיזה” (Shift) את הערך שבמשתנה, בביט אחד שמאלה בכל שלב. התוצאה תהיה יצירת הערכים הרצוים, לפי הסדר, אך בנפח קוד קטן יותר. אם תמצאו מספר מקומות בהם ניתן לבצע שיפור דומה, צמצום הנפח עשוי להיות משמעותי.
  • אם אתם מכירים את אופן הפעולה הפנימי של הקומפיילר, ניתן לעיתים לסדר את הקוד בצורה "ידידותית לקומפיילר", שתתרום להקטנת נפח הקוד הסופי. אופטימיזציה מהסוג הזה דורשת היכרות עם הקומפיילר (למשל מדפי הנתונים של היצרן), וגם הניסיון לאורך זמן, יעזור בשיפור התוצאות.
  • סירקו את הקוד וודאו שאין בו נתונים שהוגדרו, תופסים מקום בזכרון ולמעשה אין בהם שימוש. מצב נפוץ כזה הוא הגדרת מחרוזות של הודעות שונות, שהוספו לקוד בשלב כלשהו, אבל בהמשך לא בוצע בהן שימוש, ובכל זאת הן נותרו בקוד, מתקמפלות ותופסות מקום מיותר.
  • אם הקוד שלכם כתוב באסמבלי, ואתם במצב שצריך "להקטין את הקוד רק בכמה בייטים”, כדי שיתאים לנפח הזכרון העומד לרשותכם, נסו את הטיפים הבאים:
    • תמירו פקודות קיימות לצורה מקוצרת יותר אם אפשר, למשל במקום MOV A,#0 אפשר XOR A (אסמבלי של משפחת 8051).
    • אם למיקרובקר יש פקודות הסתעפות מקוצרות, תשתמשו בהם. למשל AJMP במקום LJMP (אסמבלי של משפחת 8051).
    • שיטה נוספת להקטנת הקוד במספר בתים, היא לנסח מחרוזות מחדש, כך שיהיו קצרות יותר. למשל, במקום להציג את ההודעה "Press the button to start operation", אפשר לכתוב "Press button to start" ולחסוך מספר בתים. ההודעה תהיה מעט פחות אינפורמטיבית, אך לפעמים זה מה שעושה את ההבדל, בין להצליח או להכשל ב"דחיסת" התוכנית לזכרון בנפח מוגבל, כאשר אין די זמן לבצע שינויים מהותיים בקוד.

אופטימיזציה משמעותית לנפח הקוד, זו פעולה מורכבת שדורשת הכרות עם הנושא. במקרים מסוימים בהם הקוד לא עבר הליך אופטימזציה מעולם, ייתכן שמהנדס תוכנה מנוסה יצליח להקטין את הקוד עד כדי 50% מנפחו ההתחלתי. ככל שתתנסו יותר בביצוע אופטימיזציה לקוד, כך תשתפרו בצמצום נפח הקוד למינימום ההכרחי.