יעילות של לולאת for

יעילות של לולאת for

חשבתי שאולי, בהקשר של יעילות, אפשר להמיר את הלולאת for הבאה:
for (int i = 0; i < N; i++)​
ל:
for (int i = 0; i != N; i++)​
נראה לכם שזה אכן יעיל יותר ו/או שווה את זה? אגב, השאלה נראית לי רלוונטית גם ל CPP.
 
אם אני לא טועה, ותקנו אותי אם כן

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

Zeliran

New member
הממ...

אני מאוד לא בטוח בזה, אבל יתכן ומאחר שהקוד קודם מתקמפל ל MSIL אז יתכן וקיים הבדל.. למשל כתבתי את הפונקציה הבאה:
static void Main(string[] args) { int num = 0; for(int i=0;i<10;i++) num++; for(int i=0;i!=10;i++) num++; }​
ולאחר שימוש וה MSIL שלה הוא:
.method private hidebysig static void Main(string[] args) cil managed { .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() .entrypoint // Code Size: 37 byte(s) .maxstack 2 .locals ( int32 num1, int32 num2, int32 num3) L_0000: ldc.i4.0 L_0001: stloc.0 L_0002: ldc.i4.0 L_0003: stloc.1 L_0004: br.s L_000e L_0006: ldloc.0 L_0007: ldc.i4.1 L_0008: add L_0009: stloc.0 L_000a: ldloc.1 L_000b: ldc.i4.1 L_000c: add L_000d: stloc.1 L_000e: ldloc.1 L_000f: ldc.i4.s 10 L_0011: blt.s L_0006 L_0013: ldc.i4.0 L_0014: stloc.2 L_0015: br.s L_001f L_0017: ldloc.0 L_0018: ldc.i4.1 L_0019: add L_001a: stloc.0 L_001b: ldloc.2 L_001c: ldc.i4.1 L_001d: add L_001e: stloc.2 L_001f: ldloc.2 L_0020: ldc.i4.s 10 L_0022: bne.un.s L_0017 L_0024: ret }​
עכשיו, אני בכלל לא מתיימר אפילו להתקרב להבין מה הולך שם.. אבל ממה שאני מאמין והצלחתי להבין לא הצלחתי לראות הבדלים בין שני הלולאות.. אבל רק נזכור שאני בכלל לא מתימר לדעת לקרוא MSIL, אז אם אתם יכולים, תקנו אותי!
 

סומבודי

New member
1. ברור שיש הבדל ב-IL.

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

Zeliran

New member
כן, אבל..

מה לגבי היעילות באמת? יש הבדל? (ללא קשר לכשל לוגי..)
 
ברור שאין הבדלים משמעותים

כל ההבדל הוא בצורת ההתנייה -ובאסמבלר זה בוודאי ייהפך לסוג קפיצה מסויים -ואז כמו לכל פקודה מפורט כמה פעימות מחשב(X פעימות לפקודה Y) יש לכל פקודה(זה כמובן תלוי בסוג המעבד), , וכמו שאמרתי זה ממש לא עקרוני מה יותר יעיל בין שתיהם (אולי אם עובדים אם REAL TIME) ההבדל בנהים זניח.
 
למעלה