עבור לתוכן

קוד יעיל או קריא??????

Featured Replies

פורסם

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

עכשיו חשוב לי מאוד היעילות בשביל המהירות אך מצד שני זה בא על חשבון הקוד הקריא.

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

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

אני יחסית בשלבי סיום של התוכנה ושאני מסתכל לאחור אפשר לוותר על כמה סריקות ולעשות כמה דברים בתוך לולאה.

אני מניח שבהמשך בקטע הקימפול יהיו כמה טעויות אך נראה לי שזה יעבוד....

פורסם

תמיד עדיף קוד כמה שיותר קריא, עדיף שתתרגל לזה כבר מעכשיו, כך יהיה לך הרבה יותר נוח כשתעבוד עם פרוייקטים גדולים בעתיד.

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

לעומת זאת עם יצוץ לך רעיון עוד שבוע, עדיף שתוכל להסתכל על הקוד ולהבין מהר מה עשית, מאשר לשבור את הראש ולקוות שהשינוי החדש

לא הורס כלום.

פורסם

למה אתה חושב שזה או זה או זה?

פיצול של פונקציה אחת למספר תתי פונקציות לא יוריד לך מהביצועים

^^^

בדיוק

פורסם
  • מחבר

אני יסביר את העניין בתוספת הסבר.

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

פורסם

תמיד טוב לכתוב קוד כמה שיותר קריא, אמנם זה עשוי לבוא על חשבון של יעילות, אבל לא נראה לי שתרגיש את זה.

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

פורסם

אם זה רק פי 2(או פי כל מספר אחר) אז לא מחשיבים.

פורסם

אם זה רק פי 2 [glow=red,2,300](או פי כל מספר אחר)[/glow] אז לא מחשיבים.

:screwy:

אתה מתכוון לרמת יעילות של פי 2, או לזמן ביצוע ארוך פי 2? :-\

מה זה אמור להביע "פי כל מספר אחר"? :nixweiss:

מתי כן מחשיבים? ::)

פורסם
אם זה רק פי 2(או פי כל מספר אחר) אז לא מחשיבים

אני לא יודע מי זה "הם" שמחשיבים או לא מחשיבים, אבל אני יודע שלי מאוד אכפת אם משחק שאני מריץ יעבוד ב- 20 פריימים לשניה או 40 פריימים.

לאופטימיזציה יש שני חוקים:

1. Don't do it

2. Don't do it YET

כלומר, אל תנסה לשפר ביצועים לפני שהתוכנית עובדת.

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

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

למרות זאת קריאה לפונקציה inline לא עולה כלום (כי זו לא באמת קריאה לפונקציה).

פורסם

אני מתכוון לסדרי זמן ריצה.

n=o(n)

2n=o(n)

זה הכל.

כך שאם תריץ כמה לולאות אחת אחרי השניה לא יהייה הבדל משמעותי בביצועים.

לפי דעתי הפיצול הוא כדאי.

פורסם

מה לעשות, בעולם האמיתי סדר גודל זמן ריצה זה לא הכל.

ותכנית שייקח לה שעתיים לרוץ תהיה הרבה פחות טובה מתכנית שיקח לה רק שעה.

פורסם
  • מחבר

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

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

אפשר להניח לפני כמה זמן בערך יקח לתוכנית הזאת לרוץ?????

פורסם

אני מתכוון לסדרי זמן ריצה.

n=o(n)

2n=o(n)

זה הכל.

כך שאם תריץ כמה לולאות אחת אחרי השניה לא יהייה הבדל משמעותי בביצועים.

לפי דעתי הפיצול הוא כדאי.

כל זה טוב ויפה בתאוריה

אבל במציאות שיש לך פתרון שרץ n ופתרון שרץ 1000n עדיף תמיד את ה-n.

אם ל-n לוקח 10 שניות לרוץ תחשוב כמה זמן לוקח ל-1000n.

בכל מקרה כל פיתרון שהוא לא יעשה יהיה O(1) כי מרחב הבעיה סופי (n=3).

פורסם

תחשוב על דרך אחרת לפתרון.

אתה צריך לעשות חיתוך בין כמה קבוצות.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים