דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. JS הערות על שיקולים בלולאת for

JS הערות על שיקולים בלולאת for

מתוזמן נעוץ נעול הועבר תכנות
11 פוסטים 4 כותבים 587 צפיות 1 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • dovidD dovid

    @שאול אני נהנה מהקוד שלך כי הוא מראה על תחכום, ועל ראש מתכנת.
    מה שבעצם חיפשת זה להעלות את המשתנה a באחד בכל סיבוב.
    אולם אתה מצהיר על הa בתוך הלולאה אז הוא לא יכול לזכור מה היה ערכו ב"גלגול" הקודם. צריך להכריז עליו מחוץ לולואה ועם let כי const זה לא בר עדכון.
    העלאה באחד של משתנה זה פעולה פשוטה , a = a + 1, או בדרך הקצרה a++; ככה:

    let a = 0
    for (e of s) {
      a++;
      console.log(s[s.length - a])
    }
    

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

    for (let a = 1; a < (s.length + 1); a++) {
      console.log(s[s.length - a])
    }
    

    בגלל הגמישות של לולאת for אז אפשר ישירות לעשות מניה הפוכה:

    const s = str.match(/.{1,10}(\s|$)/g);
    
    for (let i = s.length -1; i > -1; i--){
        console.log(s[i])
     }
    

    מה שעשיתי זה קביעת המשתנה i למספר הגבוה, וכל פעם לרדת אחד עד האפס.
    יש בעצם שלוש חלקים, אתחול (let i = s.length -1), תנאי (i > -1), ועדכון מונה (i--).
    האתחול קורה פעם אחת לפני הלולאה בכל מקרה, התנאי נבדק כל פעם לפני האיטרציה (כל "סיבוב") ועדכון המונה מתרחש אחריו.

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

    OdedDvirO מנותק
    OdedDvirO מנותק
    OdedDvir
    כתב ב נערך לאחרונה על ידי
    #1

    @dovid אמר בריצה בלופ מהאחרון לראשון בJS:

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

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

    yossizY dovidD 2 תגובות תגובה אחרונה
    3
    • OdedDvirO OdedDvir

      @dovid אמר בריצה בלופ מהאחרון לראשון בJS:

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

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

      yossizY מנותק
      yossizY מנותק
      yossiz
      כתב ב נערך לאחרונה על ידי yossiz
      #2

      @OdedDvir אני לא חושב שגודל המערך משפיע על הביצועים של הגישה לאורך. זה נשמר בשדה ולא מחושב כל פעם.

      עריכה: עכשיו הבנתי שאתה מתכוון שבמערך גדול יש המון איטרציות

      📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

      תגובה 1 תגובה אחרונה
      4
      • yossizY מנותק
        yossizY מנותק
        yossiz
        כתב ב נערך לאחרונה על ידי
        #3

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

        📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

        תגובה 1 תגובה אחרונה
        6
        • OdedDvirO OdedDvir

          @dovid אמר בריצה בלופ מהאחרון לראשון בJS:

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

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

          dovidD מנותק
          dovidD מנותק
          dovid
          ניהול
          כתב ב נערך לאחרונה על ידי dovid
          #4

          @OdedDvir בהמשך למה ש@yossiz כתב,
          שים לב ש@צדיק-תמים הציע (ובצדק בהתחשב בנסיבות) להפוך את המערך, וגם ליצור עותק אם רוצים לשמור על הסדר במקורי... מדובר בהכבדה של אלפי אחוזים על המעבד והזיכרון, אלפי אלפי אבל בלתי מורגש ולא ראוי לייחס במקרים קלאסיים.
          זה מאוד רווח ושכיח בJS, כשהגעתי לJS (עם ניסיון C#) יצאתי מדעתי על כל כזה דבר.
          כיום אני חושב שבמידה מסויימת זה בריא, כי הגיוני להתעלם מזה. מתכנת חייב לסגל לעצמו גם את האפשרות להתמקד במטרה ולא בפרטי הביצוע (ניהול ברזולוציה נמוכה..). אני שילמתי יקר על השיעורים האלה, אבל עד היום לא למדתי לקח לגמרי, כי אידאולוגית אני חייב להישאר במחנה השפוי שאוהב את הקוד ולא משתמש בו כמו בדפיקה על מכונת פחיות תקולה.
          בעיית ביצועים שאני מציע להתייחס ולהיזהר ממנה גם בסקאלות חסרות משמעות, היא בעיה חבויה שלא ברורה מאליה. פה למשל כאשר הקוד יהפוך לאיטי וירצו לשפר אותו, הבעיה תקפוץ לעין מייד - כתוב במפורש את בזבוז הביצועים.
          עוד הערה, בC# גישה לאורך מערך נחשבת גישה למשתנה. במילה "מעריכים" שכתבת על length נשמע שזה פעולת חישוב, ולזכורני יש בזה אמת בJS (למרות שזה לא פונקציה) אבל בתכלס כמו שאמר @yossiz המנועים של javascript כיום מוחקים את ההבדל הזה לגמרי כנראה https://jsben.ch/4WrFK.

          • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
          • בכל נושא אפשר ליצור קשר dovid@tchumim.com
          OdedDvirO תגובה 1 תגובה אחרונה
          7
          • dovidD dovid

            @OdedDvir בהמשך למה ש@yossiz כתב,
            שים לב ש@צדיק-תמים הציע (ובצדק בהתחשב בנסיבות) להפוך את המערך, וגם ליצור עותק אם רוצים לשמור על הסדר במקורי... מדובר בהכבדה של אלפי אחוזים על המעבד והזיכרון, אלפי אלפי אבל בלתי מורגש ולא ראוי לייחס במקרים קלאסיים.
            זה מאוד רווח ושכיח בJS, כשהגעתי לJS (עם ניסיון C#) יצאתי מדעתי על כל כזה דבר.
            כיום אני חושב שבמידה מסויימת זה בריא, כי הגיוני להתעלם מזה. מתכנת חייב לסגל לעצמו גם את האפשרות להתמקד במטרה ולא בפרטי הביצוע (ניהול ברזולוציה נמוכה..). אני שילמתי יקר על השיעורים האלה, אבל עד היום לא למדתי לקח לגמרי, כי אידאולוגית אני חייב להישאר במחנה השפוי שאוהב את הקוד ולא משתמש בו כמו בדפיקה על מכונת פחיות תקולה.
            בעיית ביצועים שאני מציע להתייחס ולהיזהר ממנה גם בסקאלות חסרות משמעות, היא בעיה חבויה שלא ברורה מאליה. פה למשל כאשר הקוד יהפוך לאיטי וירצו לשפר אותו, הבעיה תקפוץ לעין מייד - כתוב במפורש את בזבוז הביצועים.
            עוד הערה, בC# גישה לאורך מערך נחשבת גישה למשתנה. במילה "מעריכים" שכתבת על length נשמע שזה פעולת חישוב, ולזכורני יש בזה אמת בJS (למרות שזה לא פונקציה) אבל בתכלס כמו שאמר @yossiz המנועים של javascript כיום מוחקים את ההבדל הזה לגמרי כנראה https://jsben.ch/4WrFK.

            OdedDvirO מנותק
            OdedDvirO מנותק
            OdedDvir
            כתב ב נערך לאחרונה על ידי OdedDvir
            #5

            @dovid אמר בריצה בלופ מהאחרון לראשון בJS:

            במילה "מעריכים" שכתבת על length נשמע שזה פעולת חישוב, ולזכורני יש בזה אמת בJS (למרות שזה לא פונקציה).

            אני לא מבין מה בדיוק קורה מתחת למכסה המנוע של JS, שיערתי שזה מיושם כ- ReadOnly Property ב-C# שניגשים עליו באמצעות get() כך שאמורה להיות כאן איזו שהיא overhead.

            אבל בתכלס כמו שאמר @yossiz המנועים של javascript כיום מוחקים את ההבדל הזה לגמרי כנראה https://jsben.ch/4WrFK.

            לא זו בלבד, אלא שהקוד הראשון אפילו יותר מהיר?!
            f7f1639b-7ed6-4ca0-aa70-3ab3d6f576c8-תמונה.png
            9ca2c2b7-b43b-4c31-b5f3-7941e10b818a-תמונה.png

            440e173b-30a9-4828-83ff-761841d939a4-תמונה.png
            😲

            שמא מנוע-הריצה מבצע אפליה מתקנת, ומבצע אופטימציה דווקא על קוד גרוע?

            אפר שריפהא תגובה 1 תגובה אחרונה
            3
            • OdedDvirO OdedDvir

              @dovid אמר בריצה בלופ מהאחרון לראשון בJS:

              במילה "מעריכים" שכתבת על length נשמע שזה פעולת חישוב, ולזכורני יש בזה אמת בJS (למרות שזה לא פונקציה).

              אני לא מבין מה בדיוק קורה מתחת למכסה המנוע של JS, שיערתי שזה מיושם כ- ReadOnly Property ב-C# שניגשים עליו באמצעות get() כך שאמורה להיות כאן איזו שהיא overhead.

              אבל בתכלס כמו שאמר @yossiz המנועים של javascript כיום מוחקים את ההבדל הזה לגמרי כנראה https://jsben.ch/4WrFK.

              לא זו בלבד, אלא שהקוד הראשון אפילו יותר מהיר?!
              f7f1639b-7ed6-4ca0-aa70-3ab3d6f576c8-תמונה.png
              9ca2c2b7-b43b-4c31-b5f3-7941e10b818a-תמונה.png

              440e173b-30a9-4828-83ff-761841d939a4-תמונה.png
              😲

              שמא מנוע-הריצה מבצע אפליה מתקנת, ומבצע אופטימציה דווקא על קוד גרוע?

              אפר שריפהא מנותק
              אפר שריפהא מנותק
              אפר שריפה
              כתב ב נערך לאחרונה על ידי
              #6

              @OdedDvir אמר בריצה בלופ מהאחרון לראשון בJS:

              @dovid אמר בריצה בלופ מהאחרון לראשון בJS:

              במילה "מעריכים" שכתבת על length נשמע שזה פעולת חישוב, ולזכורני יש בזה אמת בJS (למרות שזה לא פונקציה).

              אני לא מבין מה בדיוק קורה מתחת למכסה המנוע של JS, שיערתי שזה מיושם כ- ReadOnly Property ב-C# שניגשים עליו באמצעות get() כך שאמורה להיות כאן איזו שהיא overhead.

              אבל בתכלס כמו שאמר @yossiz המנועים של javascript כיום מוחקים את ההבדל הזה לגמרי כנראה https://jsben.ch/4WrFK.

              לא זו בלבד, אלא שהקוד הראשון אפילו יותר מהיר?!
              f7f1639b-7ed6-4ca0-aa70-3ab3d6f576c8-תמונה.png
              9ca2c2b7-b43b-4c31-b5f3-7941e10b818a-תמונה.png

              440e173b-30a9-4828-83ff-761841d939a4-תמונה.png
              😲

              שמא מנוע-הריצה מבצע אפליה מתקנת, ומבצע אופטימציה דווקא על קוד גרוע?

              יתכן שהמערך מחשב מחדש רק בכתיבה למערך

              OdedDvirO תגובה 1 תגובה אחרונה
              1
              • אפר שריפהא אפר שריפה

                @OdedDvir אמר בריצה בלופ מהאחרון לראשון בJS:

                @dovid אמר בריצה בלופ מהאחרון לראשון בJS:

                במילה "מעריכים" שכתבת על length נשמע שזה פעולת חישוב, ולזכורני יש בזה אמת בJS (למרות שזה לא פונקציה).

                אני לא מבין מה בדיוק קורה מתחת למכסה המנוע של JS, שיערתי שזה מיושם כ- ReadOnly Property ב-C# שניגשים עליו באמצעות get() כך שאמורה להיות כאן איזו שהיא overhead.

                אבל בתכלס כמו שאמר @yossiz המנועים של javascript כיום מוחקים את ההבדל הזה לגמרי כנראה https://jsben.ch/4WrFK.

                לא זו בלבד, אלא שהקוד הראשון אפילו יותר מהיר?!
                f7f1639b-7ed6-4ca0-aa70-3ab3d6f576c8-תמונה.png
                9ca2c2b7-b43b-4c31-b5f3-7941e10b818a-תמונה.png

                440e173b-30a9-4828-83ff-761841d939a4-תמונה.png
                😲

                שמא מנוע-הריצה מבצע אפליה מתקנת, ומבצע אופטימציה דווקא על קוד גרוע?

                יתכן שהמערך מחשב מחדש רק בכתיבה למערך

                OdedDvirO מנותק
                OdedDvirO מנותק
                OdedDvir
                כתב ב נערך לאחרונה על ידי
                #7

                @אפר-שריפה אמר בריצה בלופ מהאחרון לראשון בJS:

                יתכן שהמערך מחשב מחדש רק בכתיבה למערך

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

                אפר שריפהא תגובה 1 תגובה אחרונה
                3
                • OdedDvirO OdedDvir

                  @אפר-שריפה אמר בריצה בלופ מהאחרון לראשון בJS:

                  יתכן שהמערך מחשב מחדש רק בכתיבה למערך

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

                  אפר שריפהא מנותק
                  אפר שריפהא מנותק
                  אפר שריפה
                  כתב ב נערך לאחרונה על ידי
                  #8

                  @OdedDvir יש לך עוד השמה

                  OdedDvirO תגובה 1 תגובה אחרונה
                  2
                  • אפר שריפהא אפר שריפה

                    @OdedDvir יש לך עוד השמה

                    OdedDvirO מנותק
                    OdedDvirO מנותק
                    OdedDvir
                    כתב ב נערך לאחרונה על ידי
                    #9

                    @אפר-שריפה לרגע שמחתי, אבל למרבה הפלא גם כשהעברתי את ההשמה להצהרות, למרות שהיה שיפור, עדיין הקוד הראשון מהיר יותר:
                    03fee8c9-c06a-478a-8ee8-f8ebf650b0b7-תמונה.png

                    dovidD תגובה 1 תגובה אחרונה
                    2
                    • OdedDvirO OdedDvir

                      @אפר-שריפה לרגע שמחתי, אבל למרבה הפלא גם כשהעברתי את ההשמה להצהרות, למרות שהיה שיפור, עדיין הקוד הראשון מהיר יותר:
                      03fee8c9-c06a-478a-8ee8-f8ebf650b0b7-תמונה.png

                      dovidD מנותק
                      dovidD מנותק
                      dovid
                      ניהול
                      כתב ב נערך לאחרונה על ידי
                      #10

                      @OdedDvir אוייש, המודד הזה (ואולי כל מודד בJS בדפדפן) לא מספיק איכותי בשביל לדון על כל שבריר אחוז... ניסיתי עבורך והפכתי את הסדר, המגמה השתנתה. כפי שצפיתי.
                      כבר @צדקי תמים שאל על מקרה דומה פה
                      מהירות הרצת קוד ב-JS [כרום], או "למה המהירות לא קבועה?"

                      • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                      • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                      OdedDvirO תגובה 1 תגובה אחרונה
                      6
                      • dovidD מנותק
                        dovidD מנותק
                        dovid
                        ניהול
                        כתב ב נערך לאחרונה על ידי
                        #11

                        אפרופו ביצועים, לפני כמה ימים בגלל בדיקה של נושא כל שהוא בJS (הפיכת כל האותיות הראשונות לרישיות) הגעתי לstackoverflow לנושא בו הציעו כמה רעיונות ותמיד יש את הספורטיבי שנסחף למבחן ביצועים.
                        התעניינתי בביצועים ושיחקתי במבחן והבחנתי בפרטים קטנים שמשנים הרבה יותר ממה שאנו דנים כעת.
                        למשל, סוגריים ברג'קס. כידוע סוגריים ברג'קס משיגים שני תוצאות: א. קיבוץ ובידוד חלקים ב. חילוץ חלקים בתוצאה לקבוצה בפני עצמה.
                        יש צורה לכתוב סוגריים שלא מחלצים קבוצה החוצה, non-capturing group. עושים זאת ע"י ?: בתחילת הסוגריים. זה זול משמעותית מקיבוץ רגיל. אגב למי שעושה אפליקציית נוד, זה יכול להיות משמעותי עד כדי חסיכת מתקפת DoS (כמו כל שיפור של אחוזים בגבולות יכולת השרת לשניה). באקספרס הרבה פעמים הניתוב עשוי מרג'קס.

                        • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                        • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                        תגובה 1 תגובה אחרונה
                        5
                        • dovidD dovid העביר נושא זה מ-תכנות ב-
                        תגובה
                        • תגובה כנושא
                        התחברו כדי לפרסם תגובה
                        • מהישן לחדש
                        • מהחדש לישן
                        • הכי הרבה הצבעות


                        בא תתחבר לדף היומי!
                        • התחברות

                        • אין לך חשבון עדיין? הרשמה

                        • התחברו או הירשמו כדי לחפש.
                        • פוסט ראשון
                          פוסט אחרון
                        0
                        • דף הבית
                        • קטגוריות
                        • פוסטים אחרונים
                        • משתמשים
                        • חיפוש
                        • חוקי הפורום