Factory

ASP zone

New member
Factory

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

ASP zone

New member
הערה:

פירסמתי שאלה כזאת כאן... אני עדיין לא מצליח לפתור. השפה המדוברת היאC++
 

עידו פ

New member
ניסית או שאתה מניח ?

אני בטוח ש-++C יכול להסתדר בלי בעיה עם יצירת אלפי אובייקטים, אפילו אם יש קוד של abstract factory בהם (מקסימום, ייקח לו עוד אלפית שנייה החישוב של ה-factory). תנסה ואם תיתקל בבעיות ביצועים, אני מניח שנוכל לעזור.
 

ASP zone

New member
אני ניסיתי עם hash

לא הלך. הבעיה היא בעיה בביצועים של כל העסק. איך אני יכול לצמצם X בדיקות ל מספר יותר קטן?
 

arn0n

New member
זה תלוי בסוג הבדיקות...

אני מבין שאתה מריץ 1000 בדיקות בצורה סדרתית... אולי תתן דוגמה ל-10 בדיקות? מבלי לדעת מה הבדיקות בודקות, קשה להציע לך אופטימיזציות. אבל יש כמה דברים כלליים שאתה יכול לעשות. דבר אחד הוא לסדר את הבדיקות לפי הסיכוי שהן תקבלנה תשובה חיובית: אם 90% מהאובייקטים שנוצרים מתחלקים בין 10 מחלקות, אזי פשוט תסדר את הבדיקות כך ש-10 המחלקות הללו תבדקנה ראשונות... דבר אחר, שתלוי הרבה יותר באופי הבדיקות: אם ניתן לחלק את האובייקטים לפי מאפיינים שונים, אז אפשר לסדר את הבדיקות במבנה של עץ, וכך לצמצם את מספר הבדיקות בסדר גודל.
 

ASP zone

New member
הבדיקה הולכת ככה

היא ממוינת לפי שם, וסוג האובייקט (לפי namespace ותתי קטגוריות). איך אני מחלק את זה לעץ?
 

arn0n

New member
עץ בדיקות

נניח שיש לך 30 שמות, ובכל אחד מהשמות, 35 סוגים. אז קודם אתה צריך לבדוק את השמות - במקרה הגרוע זה 30 בדיקות. אח"כ אתה בודק את הסוגים שמתאימים לשם שמצאת - במקרה הגרוע זה עוד 35 בדיקות. כך יוצא שאתה לא מבצע יותר מ-65 בדיקות, שזהו שיפור משמעותי על פני 1000. אם אתה גם משתמש בטריק של ה-HASH, אז הבדיקה של השמות הופכת להיות צעד בודד.
 

ASP zone

New member
אני לא מוצא ספריית hash נורמלית

אני משתמש בDev-Cpp. אבל נגיד יש לי 1000 שמות שמתחלקות ל 10 סוגים שונים.
 

arn0n

New member
מה רע ב-map של STL?

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

עידו פ

New member
שאלה והצעה

השאלה : האם בדקת איפה בעיית הביצועים ? לדוגמה - האם הבעיה היא בזמן היצירה של כל אובייקט (פעולת ה-new) או בזמן שגוזלת מתודת ה-factory ? ההצעה : תסביר קצת יותר לעומק במה מדובר - מה עושה מתודת ה-factory שלך ? מה מקור הנתונים (משתמש/DB...) ? זה יעזור אם גם תיתן קצת פירוט לגבי הזמנים שלוקח להריץ (יכול להיות שלך זה ממש לא נראה הגיוני שייקח 3 שניות לייצר אלף אובייקטים, אבל אולי נוכל להרגיע אותך שזה זמן הגיוני לגמרי).
 

ASP zone

New member
הבעיה היא שאני צריך לייצר אובייקט

אחד מתוך כל האלפים. מקור הנתונים הוא המתכנת if-else-if בינתיים. מתודת הfactory שלי יוצרת אובייקט מתוך רשימה ורושמת אותו בGarbage Collector. עכשיו הריצה על הרשימה צריכה להיות מהירה. ו3 שניות זה לא טוב לי כי זה משחק. תאר לעצמך שאני אצטרך לצייר בית על המסך ויקח לו 3 שניות לטעון אותו לזיכרון. 3 שניות זה המון.
 

עידו פ

New member
סתם פתרון יעילות בזריקה מהשרוול

למה שלא להכין מראש את כל האובייקטים האפשריים, לשים אותך בתוך hash ולפי האובייקט שאתה צריך פשוט לגשת ל-hash ולהחזיר אותו ? לחילופין, לשים בתוך כל תא ב-hash אובייקט factory שכל יעודו הוא לייצר instance חדש של האובייקט שאתה רוצה. ככה אין if-then-else אלא גישה ישירה. דרך אגב, למיטב זכרוני אחד הדברים שעושים במשחקים הינו טעינה רבה של אובייקטים לזיכרון טרם הפעלת המשחק עצמו, לא ?!
 

ASP zone

New member
אני ניסיתי את הhash

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