שאלה פילוסופית עד איזו רמה של מיקרו אופטימיזציה האדם מצווה לדקדק
-
נטייתי כמובן להחמיר ולחסוך גם זמן עיבוד של מחרוזת ורג'אקס וכדומה, אולם יודע אני שחלוקים עלי חביריי, ולכן אני מנסה למצוא את דרך המלך בנושא.
נושא ספציפי שעומד לנגד עיניי כרגע היא מחלקה שתפקידה לבצע סוג של "תרגום" כפשוטו, סטרינג כנגד סטרינג, עם כל מיני עיבודים שונים ומשונים ורעג'עקס וכדומה. חשבתי לייעל אותה על ידי שמירה בקאש של הערכים שכבר תושאלו, אבל בשביל כמה מיליסקנד? נו באמת? מצד רביעי, כשתהיה לי לולאה של מאה אלף זה יהיה משמעותי, וכן הלאה.
בקיצור אם למישהו יש משנה סדורה בנושא אשמח לשמוע את דעתו. -
@ארכיטקט מקובלנו מפי רבותינו:
על שלושה דברים הקוד עומד: על התקינות, על הקריאות, ועל הביצועים. ובסדר הזה דייקא.מצאתי במגילה עתיקה הכתובה בלשון לעז:
Make It Work Make It Right Make It Fast
עוד מקובלנו מפי רבותינו:
מיטוב שלא במקום צוואר בקבוק, בזבוז אנרגיהע"ע https://en.wikipedia.org/wiki/Program_optimization#When_to_optimize
זקן מדע המחשבים דונלד קנות' אמר:
We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%
-
@ארכיטקט אני חושב שמתחילים צריכים להיות פאנטים (וכל תחום שלא טובים בו עוד נחשבים למתחילים בו),
אבל בתחומים שיש כבר הרגלים טובים צריך לוודא שרוב האנרגיה ממוקד בתכלית שבתכלית ורק מיעוט בביקורת ובמיטוב. ובקטגוריית תכלית אין שום דבר שקשור לתכנות, רק מוצר שעובד. -
@yossiz אמר ב[שאלה פילוסופית עד איזו רמה של מיקרו אופטימיזציה האדם מצווה לדקדק]
זקן מדע המחשבים דונלד קנות' אמר:
We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%כנראה שאני זקן מספיק כדי לומר "בדוק ומנוסה" מתוך נסיון אישי כואב.
גם ההגדרה שלו טובה מאוד, רוצה למטב? כמה אחוזים, מהמקרים/שימוש אליהם אתה מתכנן את המוצר בטווח המיידי ירויחו מזה? -
@dovid אמר בשאלה פילוסופית עד איזו רמה של מיקרו אופטימיזציה האדם מצווה לדקדק:
@ארכיטקט אני חושב שמתחילים צריכים להיות פאנטים
אם מותר לי להוסיף (מקווה שזו הבהרה ולא סילוף):
גם כאן קודם כל להיות פנאטי על ניפוי באגים ואז על קוד קריא ובנוי טוב ורק אח"כ על ביצועיםרק להאריך יותר להסביר את הכלל הזה:
קוד שלא עושה מה שביקשת ממנו לא שווה כלום גם אם זה הכי אלגנטי והכי מהר, אז ברור שעדיפות ראשונה זה קוד שעובד.
קוד שקשה לתחזוק עולה יותר מקוד איטי, לכן זה עדיפות שנייה. (כמובן מדובר כל עוד שזה עונה לדרישות, אם זה איטי עד שזה לא עונה על הדרישות אז זה בכלל השלב הראשון) -
מקבל את כל דברי חכמים מבלי כחל ושרק.
אבל מוסיף עוד משהו שאני חווה לפעמים, מיקרו אופטימיזציה אכן לא משפיעה לשעתה, אבל כשמגיע הרגע שאתה רואה ריקווסט בן 4-5 שניות, ואתה מבין שזה עוד עלול להידרדר, אז אתה פתאום מוצא את עצמך צולל בעמקי הקוד לגילוי הבעיה. וזה קרה לי ממש אתמול כשהתחלתי לטפל בבעיה כזו, התברר לי שיש קובץ טקסט שאני קורא אותו עשרות אלפי פעמים מהדיסק הקשיח (ועוד מפרסר אותו ג'ייסונאית) בעקבות לולאה שהצטרפה לחגיגה. ובמשך שנים כאשר השירות הזה ניתן ללא לולאות, אכן לא היתה לכך משמעות, ולא היה עניין "לשמר" את הטקסט הזה בזיכרון, אבל כשלולאה רצחנית נכנסה לתמונה ברור שהעסק הזה קיבל משקל עצום. לקח לי שעתיים עד שהגעתי לנקודת הקוד הזו שקבורה בעומק 4 ק"מ מתחת לאדמה.
אז זה לא אומר שההרגלים לא היו טובים, אבל כאשר גדולי ישראל בראשות מרן ראש הפורום שליט"א (לאורו לאורו לאורו Patch Patch Patch Patch Patch) אמרו שזוהי הדרך הנכונה, אנחנו נלך בה, זה המחיר של הליכה בדרך הנכונה, וכנראה שזה שווה את המחיר.
אגב הפתרון המובן מאליו במקרים כאלו הוא קאש מוגבל לזמן, ומקסימום אחת לכמה ריקווסטים מישהו יסבול קצת. -
@ארכיטקט אמר בשאלה פילוסופית עד איזו רמה של מיקרו אופטימיזציה האדם מצווה לדקדק:
כשלולאה רצחנית נכנסה לתמונה ברור שהעסק הזה קיבל משקל עצום.
ברגע הזה זה יצא מכלל "מיקרו אופטימיזציה"
אני מגדיר "מיקרו אופטימיזציה" כמשהו שמשפיע על השורה התחתונה בפחות מאחוז או פחות מ-5 אחוז. (תלוי בהקשר)
למטב את הקוד לפני הרגע הזה היה בזבוז זמן, ברגע שזה "קיבל משקל עצום" אז הגיע הזמן הנכון לשקול מיטוב ביצועים -
אני סבור כך (ומן הסתם זה כלול בדברי קודמי שאולי לא דקדקתי בהם מספיק). צריך להשקיע באחד משני המקרים:
- הכתיבה הלא-אופטימית היא מידי גרועה, ונדרש לתקנה בשביל רכישת ההרגל הנכון.
- זה השיקול העיקרי: אם יש לך חשש שמתישהו הפונקציה תגיע למצב של קריאות כמותיות משמעותית, אפילו אם כרגע אתה לא צופה שזה יכביד, תקדיש תשומת לב לאופטימיזציה דקדקנית יותר.