לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #2  
ישן 10-12-2008, 08:24
  משתמש זכר eXtruct eXtruct אינו מחובר  
 
חבר מתאריך: 27.10.05
הודעות: 1,067
בתגובה להודעה מספר 1 שנכתבה על ידי dorM שמתחילה ב "למה לולאת for מהירה יותר מ-while ?"

דוגמא משפת C:
בהינתן שני הלולאות הבאות:
קוד:
count = 0; while(count != 10){ count++; }

עבור לולאה זו האסמבלי המתקבל הוא:
קוד:
mov DWORD PTR [ebp-0x8],0x0 jmp 0x80483e2 <main+30> add DWORD PTR [ebp-0x8],0x1 cmp DWORD PTR [ebp-0x8],0xa jne 0x80483de <main+26>


ועבור:
קוד:
for(count = 0; count != 10; count++){ }

קוד האסמבלי המקתבל הוא:
קוד:
mov DWORD PTR [ebp-0x8],0x0 jmp 0x80483f5 <main+49> add DWORD PTR [ebp-0x8],0x1 cmp DWORD PTR [ebp-0x8],0xa jne 0x80483f1 <main+45>

ניתן לראות שהקוד דומה ומספר הפקודות שמעבד יבצע דומה, ויש בזה הגיון:
ניתן לכתוב את אותו FOR בצורה הרבה:
קוד:
count = 0; for( ; count!=10; ){ count++; }

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

נערך לאחרונה ע"י eXtruct בתאריך 10-12-2008 בשעה 08:28.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #5  
ישן 11-12-2008, 22:10
  encoded encoded אינו מחובר  
 
חבר מתאריך: 22.06.06
הודעות: 87
בתגובה להודעה מספר 3 שנכתבה על ידי talaus שמתחילה ב "למעשה, פרט לכך שבקוד..."


for ו while הן בעצם סה"כ אותה לולאה, אותו תנאי (בכל קומפיילר תראו דרך שונה לייצוג שלו, לפעמים בדיקה ישירה של התנאי ולפעמים רק בסוף, תלוי אם משתמשים בcl או בgcc או בכל דבר אחר...ובגירסא..)
כל הקוד ממוקמם ב.text כREADONLY וכל כתיבה לשם תיצור שגיאה, המשתנים לרוב (לרוב, אלא אם לא השתמשנו בmalloc,static,const, אולי עוד כמה שאני לא זוכר ) מוגדרים במחסנית/stack ונדרסים בכל פעם שהפונקציה מסיימת את ייעודה.
כל לולאת for אפשר לעשות בwhile וכנ"ל בdo while וכ' וכ'

ועכשיו, לגבי מה יותר מהיר, יש כל מיני שיטות שאפשר לקרוא עליהן פה (או פה בכלליות יותר) לתת אופטימיזציה ללולאות, תלוי עד כמה מתוחכם הקומפיילר וכמה אתה יודע להשתמש בכלים שהוא נותן לך (כל מיני magical __macro__voodoo כאלה).
ושוב, כל דבר תלוי בקומפיילר ובסביבה שאנחנו משתמשים. PHP בכלל משוגעת ועושה הרבה מאוד דברים אפלים (עם הרבה מאוד טבלאות האש) שלא כדאי להתעסק איתה P:
אם אתה ממש קטנוני אתה יכול להשתמש בstime או nanotime (אני לא זוכר את השם המדוייק של הפונק') שסופרת זמן ולהשוות את זמני הריצה של כל לולאה (זה מן ויכוח כמו מה יותר טוב - echo או print, יש כלכך הרבה פונק' ושמות לא סדרתיים שעולים ודורסים אחד את השני בPHP שזה פשוט משגע לפעמים)

נערך לאחרונה ע"י encoded בתאריך 11-12-2008 בשעה 22:12.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #6  
ישן 12-12-2008, 00:15
  שימיadmin שימי אינו מחובר  
מנהל פורומי "תכנות ובניית אתרים" ו"חומרה ורשתות"
 
חבר מתאריך: 25.10.01
הודעות: 42,778
בתגובה להודעה מספר 3 שנכתבה על ידי talaus שמתחילה ב "למעשה, פרט לכך שבקוד..."

שאני עשיתי את אותו ניסוי (ועוד קימפלתי בכוונה בלי אופטימזציה של הקומפיילר) עם gcc -O0 -g test.c -o test - גם הכתובות היו זהות לחלוטין - היה אותו פלט בדיוק - אבל דווקא האסמבלי (החלק של הלולאה, כמובן) נראה טיפה שונה (משל eXtruct) ונראה כך:
קוד:
$ gdb ./test GNU gdb 6.7.1 Copyright (C) 2007 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-pc-linux-gnu"... Using host libthread_db library "/lib/libthread_db.so.1". (gdb) disassemble main Dump of assembler code for function main: 0x00000000004004b8 <main+0>: push %rbp 0x00000000004004b9 <main+1>: mov %rsp,%rbp 0x00000000004004bc <main+4>: movl $0x0,-0x4(%rbp) 0x00000000004004c3 <main+11>: jmp 0x4004c8 <main+16> 0x00000000004004c5 <main+13>: incl -0x4(%rbp) 0x00000000004004c8 <main+16>: cmpl $0xa,-0x4(%rbp) 0x00000000004004cc <main+20>: jne 0x4004c5 <main+13> 0x00000000004004ce <main+22>: mov $0x0,%eax 0x00000000004004d3 <main+27>: leaveq 0x00000000004004d4 <main+28>: retq End of assembler dump. (gdb)


מעניין...

כמו כן יש את העניין שב while אפשר לעשות שבלוק הקוד ירוץ פעם אחת ורק אז התנאי ייבדק - משהו שב for לא כל כך פשוט לעשות (לא אומר שבלתי אפשרי - פחות טריוויאלי...)
_____________________________________
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה
נמאס לכם לזכור סיסמאות? לחצו כאן!

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #11  
ישן 14-12-2008, 04:23
  rtasjugythhh rtasjugythhh אינו מחובר  
 
חבר מתאריך: 07.11.08
הודעות: 52
בתגובה להודעה מספר 9 שנכתבה על ידי eXtruct שמתחילה ב "בעע סורי שלא עניתי הייתי עסוק..."

DWORD זה Double Word ולא "Data Word", כמו ש-QWORD זה Quad Word.
מילת מכונה (Word) ב-PC-ים היום היא 4 בתים (במעבדי 32-ביט) או 8 בתים (במעבדי 64-ביט), אבל המושגים נשארו מעידן מעבדי 16-ביט של אינטל, ולכן כשמדברים על גדלים Word בד"כ מציינת 2 בתים. לכן, DWORD מציינת 4 בתים - 2 מילות מכונה.

דוגמה מהקרנל של לינוקס:
קוד PHP:
 #define PRINT_LMIP_byte(_h, _lseq, _n)                              \
    
asd_printk(STR_8BIT#_n, LmSEQ_##_n(_lseq)-LmSCRATCH(_lseq), \
           
asd_read_reg_byte(_hLmSEQ_##_n(_lseq)))
#define PRINT_LMIP_word(_h, _lseq, _n)                              \
    
asd_printk(STR_16BIT#_n, LmSEQ_##_n(_lseq)-LmSCRATCH(_lseq), \
           
asd_read_reg_word(_hLmSEQ_##_n(_lseq)))
#define PRINT_LMIP_dword(_h, _lseq, _n)                             \
    
asd_printk(STR_32BIT#_n, LmSEQ_##_n(_lseq)-LmSCRATCH(_lseq), \
           
asd_read_reg_dword(_hLmSEQ_##_n(_lseq)))
#define PRINT_LMIP_qword(_h, _lseq, _n)                                \
    
asd_printk(STR_64BIT#_n, LmSEQ_##_n(_lseq)-LmSCRATCH(_lseq), \
         
(unsigned long long)(((unsigned long long) \
         
asd_read_reg_dword(_hLmSEQ_##_n(_lseq))) \
              
| (((unsigned long long) \
         
asd_read_reg_dword(_hLmSEQ_##_n(_lseq)+4))<<32))) 


ובווינדוס:
קוד PHP:
 typedef unsigned long DWORD, *PDWORD, *LPDWORD
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 23:08

הדף נוצר ב 0.07 שניות עם 11 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2026 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר