עבור לתוכן

יעילות

Featured Replies

פורסם

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


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

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



b= !!(a-8);

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

פורסם

ל?מה ה-!! (not not)?

פורסם

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

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

פורסם

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

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

!!(a-8)

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

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

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

פורסם

זה ממש לא משנה ....המעניין הוא איך הגעתה למצב כזה שאתה שואל את השאלה הזו .....

האלגורתמים עצמו ...הוא יותר חשוב ....ה IF הם זניחים ..מאוד

פורסם

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

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

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

פורסם

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

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

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

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

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

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

בהרבה מעבדים יש predicated instructions - פעולות אשר מתבצעות בתלות בתנאי כלשהו, ללא צורך בקפיצה. במעבדים כאלה, הקומפיילר מקמפל if לסוג כזה של instruction כאשר זה יעיל יותר. דוגמא למעבדים כאלה: arm, 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 על ערך מספרי?

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


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)

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

ארכיון

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

דיונים חדשים