בנושא אופטמיזציה בניצול משאבים
-
יש לי כמה שאלות בנושא, הנה הראשונה:
אם יש לי מערך:Dim arr(1000000) As String For i = 0 To 1000000 arr(i) = i.ToString Next arr = Nothing
האם בשורה האחרונה הזיכרון משתחרר?
אם לא איך אני משחרר אתו כדי לא להגיע שהערכת עבודה של התוכנה שלי עוברת את הג'יגה?
יש לי בתוכנה במהלך עיבוד המידע הרבה מערכים גדולים מאוד, אני לוקח מהם מעט איברים ואחר כך אני כבר לא צריך את המערך, אבל העיבוד מידע ממשיך ונוצרים עוד ועוד מערכים והישנים לא משתחררים והערכת עבודה של התוכנה עולה ועולה ללא צורך.פורסם במקור בפורום CODE613 ב04/04/2014 12:02 (+03:00)
-
הוא לא מוחק את המערך, רק את המשתנה המפנה אליו. למחיקת המערך השתמש ב
Array.Clear
פורסם במקור בפורום CODE613 ב04/04/2014 17:14 (+03:00)
-
הClear לא עשוי בדוט נט לניקיון אלא פשוט להחזיר את כל ערכי המערך למצבם התחילתי.
בעיקרון מבחינת המתכנת צריך לדאוג שאין רפרנסים חיים לאובייקטים מיותרים.
לדוגמה אם יש אובייקט ענק ושדה שלו בשימוש איזה אירוע זה מונע הריסה של האובייקט, זה תחום אחירות המתכנת. כל השאר זה דאגה של ה"אוסף הזבל" של דוט נט.
אבל במידה והמשתנה הוא בסקופ של פונקציה לדוגמה, אין צורך אפי' לאפס אותו, סוף התחום שלו הרוס אותו וממילא המידע שלו "יתום" וככזה הGC - "אספן הזבל" מוחק אותו [u:3n26xzb3]מתי שהוא[/u:3n26xzb3].
בתכלס תוכל לראות שאם תעמיס אלפי מגה, מידי פעם תהיה "מחיקה" מסיבית, משא"כ במגה בודדים (מתחת למה שהוקצה לתוכנית מלתכחילה) מסיבות חיסכון בביצועים כנראה הGC לא עושה כלום.
אפשר לאלץ את הGC לאסוף ככה: GC.Collect, אני חושב שזה לא מומלץ ולא יודע למה זה משמש, תוכל לראות שזה עשוה את העבודה באמת בצורה דרמטית מבחינת הזיכרון.באובייקטים שיש שימוש במשאבים חיצוניים, שלא תחת ניהול הדוט נט, יש צורך בטיפול בסגירת העסק, ובד"כ הם מממשים את IDisosabe ויש לקורא למתודה המתאימה או לעטוף עם Using.
פורסם במקור בפורום CODE613 ב06/04/2014 14:13 (+03:00)