02-08-2005, 17:56
|
|
|
|
חבר מתאריך: 20.06.03
הודעות: 5,616
|
|
אופטימיזציה של קוד - מבוא
אופטימיזציה של קוד
פרק ראשון בסדרה
נכתב עיי זיו פרי, מבוסס על מידע של microsoft
MSDN, Microsoft Press
מאמר זה יעסוק באופטימיזציה של קוד בדגש על המהדר של Visual C++ של מיקרוסופט.
עקרונות האופטימיזציה תקפים לגבי מרבית המהדרים, אך אני מכיר את הנושא במהדר של מיקרוסופט.
השאלה הראשונה הנשאלת בהקשר זה, האם על הקוד להיות "קטן" או "מהיר". בפועל אין קשר בין
נושאים אלו. קוד מהיר יותר לעיתים גדול יותר עקב אלגוריתמיקה מתקדמת יותר.
בעיקרון קיימות כמה רמות של אופטימיזציה. חלקן שייכות למהדר, וחלקן למפתח.
הרמה הגבוהה
הרמה האלגוריתמית שייכת לרמת הפיתוח, לדוגמה אלגוריתמי חיפוש כמו quick sort שהוא מהיר
יותר מ insertion sort. כמו שנוכל לראות מהצצה באלגוריתמים אלו – בדרך כלל, האלגוריתמים
המהירים יותר הם הגדולים יותר (מבחינת קוד).
הרמה הנמוכה
רמה בסיסית של אופטימיזציה השייכת למהדר, נקראת peephole. ברמה זו המהדר משתמש
בתכונות מסוימות של הקוד על מנת לחסוך מחזורי שעון. שימוש בשיטה זו יוצר קוד שבדרך כלל קטן
יותר ומהיר יותר - אך הוא בא לידי ביטוי רק כאשר מצטברות הרבה הוראות שעוברות אופטימיזציה.
דוגמאות
ההוראה הבאה:
קטנה בשלושה בתים ואיטית פי 3 מהפקודה:
שתי הוראות אלו מציבות 0 במשתנה x, אך במהירות שונה (ובהבדלי גודל קוד).
דוגמה נוספת:
אמנם יותר קטנה יותר מההוראה הבאה, אך היא איטית פי 2 מההוראה הבאה:
הרמה הבינונית
רמה נוספת של אופטימיזציה היא טכניקות הנמצאות בין שני הרמות שהוזכרו למעלה.
נדגים שימוש ב-loop jamming או "דחיסת לולאות":
קוד PHP:
for (i=0;i<50;i++) x[i] = 0; for (j=0;j<50;j++) y[j] = j;
תהליך הדחיסה מאחד את שתי הלולאות לחסוך את כל מחזורי השעון הנדרשים לביצוע שתי לולאות:
קוד PHP:
for (i=0;i<50;i++) { x[i] = 0; y[i] = i; }
במקרה כזה המהדר אינו יכול להבחין באפשרות לאחד את הלולאות וזה תפקידו של המפתח.
שיטות נוספות (שיסקרו בהמשך) של רמה זו הינם loop hoisting, copy propagation ו-subexpression elimination.
אז מה עדיף, גודל או מהירות?
למרות שכמעט תמיד למדוד את המהירות, המשתמש לא תמיד יכול להבחין בה - במיוחד
באופטימיזציה של הרמה הבסיסית של המהדר. מבחינות מסויימות ניתן לומר שאם המשתמש
לא מרגיש בשינוי, אין טעם באופטימיזציה.
בדרך כלל, אופטימיזציה ברמה הגבוהה, כלומר אופטימיזציה אלגוריתמית היא זו שתראה חיסכון
מורגש במהירות ההרצה.
לכן האסכולה המקובלת כיום גורסת כי עדיף לבצע אופטימיצזיה ברמת הקוד (אלגוריתמיקה) ולכוון
את המהדר לבצע אופטימיזציה של גודל. שילוב זה יוביל לקובץ ביצוע מהיר יותר וקטן יותר.
מדוע בכלל אנו צריכים בגל זאת לחסוך בגודל הקובץ בעולם של מחשבים עם מאות ג'יגה של כונן
וזיכרון כמעט בלתי נדלה?
התשובה היא שמאחר שהמחשוב כיום משתמש בריבוי משימות, קובץ גדול שלא ישב כולו בזיכרון
יגרום ל page fault (פסיקה המורה למעבד שהמידע שהוא מחפש לא נמצא ב-ram אלא על הדיסק
כחלק מה"זיכרון הוירטואלי"). ריבוי פסיקות כאלו, מאיט את כל!! פעולת המחשב ומצריך קריאה
מהדיסק שהיא תהליך מאוד מאוד בזבזני של זמן.
לסיכום פרק ראשון
1. עדיף לבצע אופטימיזציה ברמת הקוד ככל שנוכל, כל זה תלוי בך - במפתח!!
2. עדיף לכוון את המהדר (לכל מהדר יש אופציות הידור שונות) לקבלת קוד ביצוע קטן ככל האפשר.
בפרק הבא, שיטות אופטימיזציה
נערך לאחרונה ע"י fat fish בתאריך 02-08-2005 בשעה 18:03.
|