האם יש הבדל מהירות בין לולאות קדימה, בזמן, בזמן ובזמן ללינים מקוננים ב- C / C ++?
תשובה 1:
int עיקרי (int argc, char * argv []) { int i, g = 0xf; עבור (i = 0; i <16; i ++) g--; }
int עיקרי (int argc, char * argv []) { int i = 0, g = 0xf; עשה { g--; i ++; } while (i <16); }
int עיקרי (int argc, char * argv []) { int i = 0, g = 0xf; בזמן (i <16) { g--; i ++; }; }
.fil "main_for.c" טקסט גלוב הראשי .type main, @ function עיקרי: .LFB0: .cfi_startproc pushq% rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq% rsp,% rbp .cfi_def_cfa_register 6 movl% edi, -20 (% rbp) movq% rsi, -32 (% rbp) <--- הכל מעל זה הוא תוכנה movl $ 15, -8 (% rbp) <- המשתנה שלנו g movl $ 0, -4 (% rbp) <- המשתנה שלנו i jmp .L2 .L3: subl $ 1, -8 (% rbp) <--- צמצום ז addl $ 1, -4 (% rbp) <--- תוספת i .L2: cmpl $ 15, -4 (% rbp) <--- השווה i ל 15 jle .L3 <---- קפוץ לאיטרציה הבאה אם פחות או שווה popq% rbp <----- כל מה שמתחת זה ניקוי התוכנית .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .גודל עיקרי,.-עיקרי .ident "GCC: (Gentoo 4.7.3-r1 p1.4, pie-0.5.5) 4.7.3" . סעיף. הערה. מחסנית GNU, "", @ progbits
movl $ 0, -4 (% rbp) <- המשתנה שלנו i movl $ 15, -8 (% rbp) <- המשתנה שלנו g jmp .L2 .L3: subl $ 1, -8 (% rbp) <--- צמצום ז addl $ 1, -4 (% rbp) <--- תוספת i .L2: cmpl $ 15, -4 (% rbp) <--- השווה i ל 15 jle .L3 <---- קפוץ לאיטרציה הבאה אם פחות או שווה
movl $ 0, -4 (% rbp) movl $ 15, -8 (% rbp) .L2: מכפיל 1 $ -8 (% rbp) addl $ 1, -4 (% rbp) cmpl $ 15, -4 (% rbp) jle .L2
.fil "main_for.c" .section .text.startup, "גרזן", @ progbits .p2 קו 4,, 15 גלוב הראשי .type main, @ function עיקרי: .LFB0: .cfi_startproc נציג ret .cfi_endproc .LFE0: .גודל עיקרי,.-עיקרי .ident "GCC: (Gentoo 4.7.3-r1 p1.4, pie-0.5.5) 4.7.3" . סעיף. הערה. מחסנית GNU, "", @ progbits
עיקרי: .LFB0: .cfi_startproc movl 15 $, -4 (% rsp) <----- מצב סוף מחושב i (cecI) movl $ 16,% eax <------- המשתנה g שלנו בפנקס .p2 קו 4,, 10 .p2 קו 3 .L2: movl -4 (% rsp),% edx <---- העבר cecI לרשם subl $ 1,% edx <--- צמצום CECI subl $ 1,% eax <--- צמצום g לפי הרשמה movl% edx, -4 (% rsp) <- העבר הרשמה ל- cecI jne .L2 נציג ret
.LFB0: .cfi_startproc movl $ 15, -4 (% rsp) movl $ 16,% eax .p2 קו 4,, 10 .p2 קו 3 .L2: movl -4 (% rsp),% edx subl $ 1,% edx subl $ 1,% eax movl% edx, -4 (% rsp) jne .L2
int עיקרי (int argc, char * argv []) { int x, y; g נדיף = 0xf; עבור (y = 0; y <16; y ++) { עבור (x = 0; x <10; x ++) { g--; } } }
int עיקרי (int argc, char * argv []) { int x, y = 0; g נדיף g = 0xf; עבור (y = 0; y <16; y ++, x = 0) { בעוד (x ++ <10) { g--; } } }
עיקרי: .LFB0: .cfi_startproc movl $ 15, -4 (% rsp) movl $ 16,% ecx .p2 קו 4,, 10 .p2 קו 3 .L2: movl 10 $,% eax .p2 קו 4,, 10 .p2 קו 3 .L3: movl -4 (% rsp),% edx subl $ 1,% edx subl $ 1,% eax movl% edx, -4 (% rsp) jne .L3 subl $ 1,% ecx jne .L2
פורסם ב ௨௫-௧௨-௨௦௧௯