שלח תשובה

זירת השאלות

320
צפיות
36
תשובות

מספר שאלות בנוגע ליעילות עבודה

,‏ 15 ביוני, 2004

שימוש ב-Option Explicit:
קראתי שלהשתמש עם Option Explicit ולהגדיר את כל המשתנים בעמוד יהיה יעיל ומהיר יותר מאשר להשתמש ללא Option Explicit בעמוד.

נגיד ויש לי 100-140 משתנים בעמוד, האם עדיף להשתמש עם Option Explicit או בלי?
אופן הביצוע, יעילות וטעינת העמוד יהיה מהיר יותר באופן משמעותי ?

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

אובייקט RecordSet
האם מומלץ להגדיר אובייקט RecordSet בתוך לולאת Do שחוזרת על עצמה מספר פעמים (קצת הרבה) או מומלץ מחוץ ללולאה? מה יעיל יותר ?

קשרי גומלין
תמיד שמעתי את המושג "קשרי גומלין", האם אפשר לקבל הסבר או קישור להסבר על המושג?

תודה מראש.

תגיות:

36 תשובות

  1. ניר טייב הגיב:

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

    קשר יחיד ליחיד – קשר נדיר, לרוב לא משתמשים בו עקב שהוא נובע מפיצול טבלאות.

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

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

  2. D30dk הגיב:

    תודה. עוד מספר דברים..
    1. מה בנוגע ל-Option Explicit ?

    2. מה בנוגע לפונקציות?

    3. עדיף בשאילתה לבחור את כל הנתונים (*) או את השדות הרצויים לשימוש בלבד??
    למשל: יש לי 15 שדות בטבלה מסויימת ואני צריך להשתמש רק עם 9 שדות בלבד.

    4. עדיף ליצור רקורסטים בתחילת העמוד ולסגור אותם בסוף העמוד או עדיף לפתוח בכל פעם ולסגור ולאפס? מה יעיל יותר?

    תודה על התשובות

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

  4. אוריקס הגיב:

    תשובות
    1. כן, תמיד.

    2. פונקציות זה טוב תמיד, רצוי אפילו ליצור קובץ חיצוני. כך הקוד קריא ותמציתי.

    3. חס וחלילה מחוץ ללולאה, ועדיף עוד יותר לעבוד עם getRows או getString. חפש במאמרים, יש שם הרבה מידע.

    4. קרא במדריך תכנון DB באתר.

  5. אוריקס הגיב:

    לא הבנתי מה הכוונה
    " קשר יחיד ליחיד – קשר נדיר, לרוב לא משתמשים בו עקב שהוא נובע מפיצול טבלאות."

  6. D30dk הגיב:

    תודה על התשובות..עוד מספר דברים
    1. בנוגע לתשובה הראשונה שכתבת, אתה אולי יכול לתת הדגמה למהירות עמוד שמשתמש ב-Option Explicit ולעמוד שאינו משתמש בו ? על מנת לראות את ההבדל מהירויות, אם הם משמעותיים.

    2. יש לי קובץ חיצוני בשם Functions.asp אז הכל מסודר.
    הפונקציות או הסאבים אינם מאטים את טעינת העמוד ?

    3. למדתי getRows אך בעמוד הבא ראיתי ש-getString מהיר יותר:
    http://users.tapuz.co.il/yoredet/asp_files/test.htm
    באתר מצאתי מאמר אך אני מעוניין ללמוד ללא אופציות.
    תמיד אני רואה דוגמאות הנראות כמו זה:

    rsGetString.GetString(adClipString, -1,"</td><td>", "</td></tr>" &vbCrLf & "<tr><td>", " ")

    ואני מעוניין להשתמש ללא האופציות, ככה:

    <%
    rs.GetString()

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

    4. תודה. אני אצפה במדריך לתכנון DB.

  7. אוריקס הגיב:

    אם אתה רוצה לפצל בשרת
    השתמש ב SPLIT, אם אתה רוצה לפצל בלקוח – יש על זה מאמר.

    בכל מקרה אתה צריך את הפרמטרים האילו…

  8. D30dk הגיב:

    הבעיה היא שאני לא יודע
    איך להשתמש בזה עם Split.
    יש לך דוגמא או מאמר בנושא ?

    מה בנוגע לשאלות הקודמות?

    תודה על העזרה.

  9. אוריקס הגיב:

    אם אתה רוצה לפצל בלקוח –
    שמסביר איך להעביר את כל ה RS בצורת מערך. אם אתה רוצה לפצל בשרת, תשתמש במתודה Split שהשימוש בה מוסבר כאן.

  10. D30dk הגיב:

    אני רוצה דרך צד שרת
    הקישור שהבאת הוא בצד לקוח (JScript) וזה לא מתאים עבורי (אם אני לא טועה).
    אפשרי לעשות זאת עם Spit ב-VBS ? אם כן, כיצד? תודה.

  11. ניר טייב הגיב:

    אם אתה רוצה לפצל את ה-getString
    למערך דו מימדי בשרת למה לא להשתמש ב-getString מלכת תחילה?
    getString נועד להעברה קלה של הנתונים ללקוח ולתצוגה ג’נרית של רשומות (טבלה למשל)

  12. אין טעם להשתמש ב-Getstring
    אם אתה ממילא מפצל… תשתמש ב-getrows.

    לגבי option explicit – הבדל המהירויות הוא זניח. זה פשוט עניין של תכנות נכון, ומניעת שגיאות לוגיות.

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

  14. D30dk הגיב:

    במידה ויש לי פונקציות וסאבים
    בעמוד פונקציות ספציפי ואני מכליל אותו בכל עמוד, האם זה יכול להאט את טעינת העמוד?

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

    לא קיבלתי תשובה לשאלה על שאילתות טבלה:
    עדיף לבחור את השדות שאני הולך להשתמש עימם בלבד בשאילתה או לבחור את כל השדות (*) ?
    לדוגמא: יש לי 15 שדות בטבלה ואני עומד להשתמש רק עם 9 שדות.

    תודה על התשובות.

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

    בקשר ל- recordset:
    http://www.sigall.co.il/sql/sql10.asp

    עדיף לבחור רק את ה- 9 שדות שאתה צריך…שוב, במידה ואתה בוחר 6 שדות שאתה לא צריך אתה מבזבז משאבי שרת לחינם..

  16. ניר טייב הגיב:

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

    מאמר על קשרי גומלין נשלח לצוות האתר

  17. D30dk הגיב:

    תודה, נותרו רק שלושה דברים נוספים
    1. נכנסתי לקישור שהבאת לי אצל סיגל אך לא ראיתי תשובה לשאלתי. יש תשובה פשוטה וקצרה.

    2. האם ההבדל בין פלט HTML ישירות ב-ASP יותר מהיר מאשר מעבר בין ASP ל-HTML?
    דוגמא:

       א. פלט + קוד ב-ASP:

    <%
       code…..
       code…..
       response.write "text…."
       response.write "<h1>big text</h1>"
       code…..
       code…..
    %>

       ב. פלט ב-HTML וקוד ASP:

    <%
       code…..
       code…..
    %>
    text….
    h1>big text</h1>
    <%
       code…..
       code…..
    %>

    השאלה היא: איזה קוד ירוץ יותר מהר? א’ או ב’ ? אצל סיגל ראיתי שקוד א’ ירוץ מהר יותר. יש הבדל משמעותי אם זה הרבה HTML וקוד ASP ?

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

    אני מעוניין ללמוד יותר על יעילות וביצוע קוד ה-ASP במקום לבזבז משאבי מערכת משמעותיים.
    יש גם מאמר כללי בנושא ?

    תודה.

  18. ניר טייב הגיב:

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

  19. אוריקס הגיב:

    2. ב’ ירוץ יותר מהר
    3. יעילות זה דבר שלומדים עם הזמן, בכל מקרה, תמיד תריץ בדיקות ותבדוק מה יעיל יותר (למרות שמהירות היא לא המדד היחידי ליעילות).

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

  21. D30dk הגיב:

    איך אני יכול לבדוק
    מה גודל הזכרון שהתכנית זקוקה לו על מנת לבצע את הפעולה ?
    כמה זה הרבה זכרון וכמה זה הממוצע ?

    יש עוד דברים שבודקים לפיהם את יעילות העבודה ?

    תודה.

  22. אמממ
    אני לא חושב יש אפשרות לבדוק את גודל הזיכרון שהתוכנית צורכת…
    אין הגבלה או סף מסוים ל’כמות זיכרון גדולה שתופסת’ משום שזה מאוד תלוי בתוכנית שלך. ל- WINDOWS ייקח יותר זמן לעלות מאשר לדף HTML פשוט בלי תמונות למרות ששניהם יעילים <בהנחה שהקוד של WINDOWS יעיל… – מה שלא קורה במציאות >…

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

  23. D30dk הגיב:

    אין עוד משהו שאני יכול לבדוק אם
    אני עובד לפיו בצורה יעילה ושאני מודע לזה ?
    כיצד ניתן לדעת אם אני מבזבז משאבי שרת מיותרים ?

    תודה.

  24. אוריקס הגיב:

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

  25. ו……
    לא רק לסגור את החיבורים, אלא גם לפנות את האובייקט connection מהזיכרון במחשב על ידי שימוש ב:
    set con=nothing

  26. D30dk הגיב:

    סגירת חיבורים אני עושה
    ואיך אני מוחק משתנים לאחר השימוש ?
    אם אני מציב הרבה משתנים זה מאט את טעינת העמוד ויעילותו ?

    החברה בא אני מאוכסן יכולה לומר לי אם אני מבזבז משאבי שרת מיותרים ? אם העניין אפשרי.

    תודה.

  27. D30dk הגיב:

    תודה ועוד דבר
    שאלתי הקודמת: אם אני מציב הרבה משתנים זה מאט את טעינת וביצועי העמוד?
    אם אני מבצע מחיקה של המשתנה לאחר השימוש, זה יאץ את טעינת העמוד או שלא יהיה הבדל אם אני לא אמחק את המשתנה?

    תודה על העזרה.

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

  29. אוריקס הגיב:

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

  30. ניר טייב הגיב:

    אבל גם השמדה של משתנה צורכת משאבים
    אם כך רק משתני אובייקטים עליי למחוק (כמו אובייקטי ADO) או כל משתנה שאני משתמש בו?

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

  32. dudubs הגיב:

    אם הוא יפצל בשרת על ידי split אז
    getrows יהיה יותר מהיר, מניסיון.

  33. revishimoni הגיב:

    אפרופו יעילות עבודה,לי יש שאלה???
    מתי יהיה יעיל ביותר באכיטקטורת asp.net,להשתמש ב- class ומתי ב- dll?????

שלח תשובה