ערכתי לאחרונה בתאריך 22.08.05 בשעה 13:23 בברכה, אופירוש
אבל , הבעיה ב - VB , שהיא לא בשלה מספיק כדי לעמוד בעומס .
ז"א , שלתוכניתן לא מנוסה (ז"א שאין לו לפחות שנתיים + ניסיון בעבודה רצינית ב - VB ולא חובבנות בבית ...) , אין סיכוי להרים מערכת גדולה .הרכיבים של VB , למשל ה - Collection , ה - RS של ADO , ה - Dictionary והפקדים הוויזואלים (נתתי רק דוגמא , יש עוד מיליון ...) לא כתובים מספיק טוב כדי לעמוד בעומס של אפליקציות גדולות , הם לא נועדו לכך ...
אפילו סינטקס בסיסי ב - VB ירוץ לאט מאוד אם לא יודעים לכתוב אותו בצורה נכונה ומבינים את כל מה שקורה מאחורה .
צריך להיות תוכניתן מנוסה מאוד , כדי להכנס לתחום של ביצועים ולהבין מה קורה מאחורה .
אני אפילו יתן דוגמא לחבר'ה שמתעסקים ב - VB ורוצים להבין למה התכוונתי .
זו דוגמא למקרה שנתקלתי בו לפני כמה שנים ,
מדובר על שרשור מחרוזות - פעולה מאוד פשוטה וטריוויאלית שכל תוכניתן עושה המון פעמים בקוד ...פעולה שיכולה לקחת נצח ...
כתבתי רגע קטע קוד שמראה את הבעייתיות של השרשור ב - VB .
למי שאין VB ולא יכול להריץ את הקטע קוד , צירפתי את התוצאה שלו בסוף ההודעה .
Private Declare Function GetTickCount Lib "kernel32" () As LongPrivate Sub Command1_Click() Dim strTempString As String strTempString = BadConcatString(1000) strTempString = BadConcatString(3000) strTempString = BadConcatString(5000) strTempString = BadConcatString(10000) strTempString = BadConcatString(20000) End Sub Private Function BadConcatString(lngStringsToConcat As Long) As String On Error GoTo Err_Handle ' משתנה זמני לשרשור המחרוזת Dim strTempString As String ' מונה לולאה Dim lngCount As Long ' יצירת Collection שיכיל את האיברים לשרשור Dim colTest As Collection Set colTest = New Collection ' מילוי ה - Collection בכמות האיברים שהועברה בפונקציה For lngCount = 1 To lngStringsToConcat colTest.Add ("OfirConcatTest" & lngCount) Next ' שליפת זמן נוכחי ממערכת ההפעלה - ב - milliSeconds Dim dblTickCount As Double dblTickCount = GetTickCount ' השרשור מתבצע בפועל , בעזרת התו השמור - & For lngCount = 1 To lngStringsToConcat strTempString = strTempString & colTest.Item(lngCount) Next ' הדפסת התוצאה לחלון ה - Immediate ובדיקת זמן ביצוע הפעולה Debug.Print "Bad Concat for " & lngStringsToConcat & " Strings took " & GetTickCount - dblTickCount & " ms ." ' החזרת המחרוזת המשורשת לפונקציה הקוראת BadConcatString = strTempString ' קטע קוד שמתבצע תמיד, גם כאשר יש שגיאה - משמש לשחרור אובייקטים Clean_Up: Set colTest = Nothing Exit Function Err_Handle: MsgBox Err.Number & " : " & Err.Description GoTo Clean_Up End Function
|
אני קראתי לפונקציה מספר פעמים , כל פעם עם כמות אחרת של שרשורים , אתם יכולים לבדוק בעצמכם את התוצאה .
למי שאין VB , צירפתי את התוצאות .
Bad Concat for 1000 Strings took 15 ms . Bad Concat for 3000 Strings took 203 ms . Bad Concat for 5000 Strings took 1235 ms . Bad Concat for 10000 Strings took 4937 ms . Bad Concat for 20000 Strings took 27109 ms .
|
כמו שאתם רואים , שרשור 5000 מחרוזות קצרות לקח יותר משניה !!!
אתם אולי רגילים לכתוב אפליקציות קטנות , והנתון אולי לא משפיע עליכם , אבל באפליקציות גדולות הנושא קריטי ביותר .
אתם יכולים לראות כמה זמן לוקח לשרשר 20000 מחרוזות ... זה כבר הופך להיות בלתי הגיוני .
בכוונה לא שמתי 30000 , בגלל שהזמנים נהיים יותר מידי מטורפים (כ - 80 שניות) .
בקיצור , צריך לדעת לכתוב ב - VB , ולא כל אחד שקרא ספר יכול לכתוב אפליקציות נורמליות .
מי שזה מעניין אותו , ורוצה לראות קטע קוד יעיל שכתבתי לפתרון הבעיה הזו , שיגיד לי ואני אפרסם אותו בפורום .
בהצלחה .
אגב , פלטפורמת .Net בשלה מספיק כדי להרים אפליקציות ענקיות .
למרות שיש מה לשפר מבחינת ביצועים , אתם לא תראו בעיות כאלו טריוויאליות ב - .Net .
שם חשבו (כמעט) על הכל . (גם על שרשור מחרוזות
)
