יעילות - עמוד 2 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

יעילות


assaf990

Recommended Posts

בגדול נראה לי שזה אותו דבר. בגלל האופי של ה|| . אם אתה רוצה שמשהו יהיה מהיר תמנע מלעשות IF אם אתה יכול ;) . למשל מישהו בעבודה שלי פעם רצה לשים לעשות דבר כזה מהר :


if(a==8)
b=0;
else
b=1;

אפשר לעשות את זה בלי if ככה :



b= !!(a-8);

מכוער, לא מובן אבל מהיר יותר מקפיצה ומהיר יותר מטבלת המרה הcompiler הבין מה רציתי לעשות ועשה את זה באיזה 3 פעולות (של PPC לא ). אם עושים את זה עם if יש קפיצה מותנת שזה הורס את רצף הפקודות ויאט את ההרצה בעיקר אם אתה עושה את הפעולה הזאת הרבה. במקרה של טבלת המרה אתה צריך להשקיע בזיכרון ואז לעשות טעינה עם offset שזה מהיר עם אתה עושה את זה בתוך loop כי אז הטבלה בcache אבל בrandom access זה לא הכי פרקטי וחוץ מזה אמרתי שאתה מבזבז קצת בשביל זה.

קישור לתוכן
שתף באתרים אחרים

כדי שזה יהיה רק אפס או אחד.

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

קישור לתוכן
שתף באתרים אחרים

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

אגב, אני בכלל לא בטוח ש-

!!(a-8)

יעיל בהרבה מלעשות if.

מי אמר שפעולת ה- ! (NOT) לא מבצעת קפיצה מותנית?

השאלה היא איך המעבד NOT על ערך מספרי?

קישור לתוכן
שתף באתרים אחרים

איזה דיון מצחיק...

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

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

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

לגבי הדיון הכללי יותר על יעילות ביצוע if:

ברוב המעבדים המודרנים ביצוע branch שאינו של לולאה (הקריטריון יותר מסובך מזה אבל מילא) הוא פעולה איטית ולא רצוייה, עקב pipeline-ים עמוקים (יותר או פחות). אבל זה לא אומר שכל if ב-C הופך ל-branch באסמבלי.

בהרבה מעבדים יש predicated instructions - פעולות אשר מתבצעות בתלות בתנאי כלשהו, ללא צורך בקפיצה. במעבדים כאלה, הקומפיילר מקמפל if לסוג כזה של instruction כאשר זה יעיל יותר. דוגמא למעבדים כאלה: , TI C60 ועוד.

אם אין כזה יכולת למעבד (ולפעמים גם כשיש) אז הרבה פעמים אכן כדאי להמנע מ-if, ובמיוחד בלולאות פנימיות.

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

הכל תלוי בדרישות הביצועים שלכם.

קישור לתוכן
שתף באתרים אחרים

מי אמר שפעולת ה- ! (NOT) לא מבצעת קפיצה מותנית?

השאלה היא איך המעבד NOT על ערך מספרי?

ב PPC מה שהוא עושה אם אני זוכר נכוון זה ככה ( כל שורה מחליפה שורת ASM אחת)

a=a^0x8

b=a+-1 ועדכן את ה carry

b=carry

מה שקורה שכל ערך שהוא לא 0 גורo לcarry במקרה שמוסיפים לו 0xffffffff . הפעולה הראשונה זה במקום החסרה (לרוב לוקח אותו זמן אבל אולי אני טועה)

אני לא בטוח איך הוא עשה ! אחד אולי b=1-b לתוצעה או שיש לו דרך יותר מהירה - לא בדקתי

אבל ב C כל מספר ששונה מאפס מסמל אמת..

לא כדאי שמי שקורא לפנקצייה ישים "!!" אם הוא צריך לקבל 0 או 1?

כן ההגדרה של ! זה 0 מתי שהמשתנה שונה מ0 ו 1 אם המשתנה הוא 0 . זה בערך ככה

a?0:1 אם אתה מכיר את הפעולה '?' :lol: תחליף מכוער ל if .

קישור לתוכן
שתף באתרים אחרים

אגב, אני בכלל לא בטוח ש-

!!(a-8)

יעיל בהרבה מלעשות if.

מי אמר שפעולת ה- ! (NOT) לא מבצעת קפיצה מותנית?

השאלה היא איך המעבד מבצע NOT על ערך מספרי?

הנה הקוד ב בלי אופטימיזציות:


int b = !!(a-8);
804837a: 83 7d 08 08 cmpl $0x8,0x8(%ebp)
804837e: 0f 95 c0 setne %al
8048381: 0f b6 c0 movzbl %al,%eax
8048384: 89 45 fc mov %eax,-0x4(%ebp)

אין קפיצה מותנית.

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...