Gibt es einen Geschwindigkeitsunterschied zwischen verschachtelten for-for-, while-while-, for-while- und while-for-Schleifen in C / C ++?
Antwort 1:
int main (int argc, char * argv []) { int i, g = 0xf; für (i = 0; i <16; i ++) G--; }
int main (int argc, char * argv []) { int i = 0, g = 0xf; tun { G--; i ++; } while (i <16); }
int main (int argc, char * argv []) { int i = 0, g = 0xf; während (i <16) { G--; i ++; }; }
.file "main_for.c" .Text .globl main .type main, @function Main: .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) <--- Alles darüber ist programinit movl $ 15, -8 (% rbp) <- Unsere Variable g movl $ 0, -4 (% rbp) <- Unsere Variable i jmp .L2 .L3: subl $ 1, -8 (% rbp) <--- Dekrement g addl $ 1, -4 (% rbp) <--- inkrementiere i .L2: cmpl $ 15, -4 (% rbp) <--- vergleiche i mit 15 jle .L3 <---- springe zur nächsten Iteration, wenn kleiner oder gleich popq% rbp <----- Alles darunter ist die Programmbereinigung .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size main,.-main .ident GCC: (Gentoo 4.7.3-r1 p1.4, pie-0.5.5) 4.7.3 .section .note.GNU-stack, "", @ progbits
movl $ 0, -4 (% rbp) <- Unsere Variable i movl $ 15, -8 (% rbp) <- Unsere Variable g jmp .L2 .L3: subl $ 1, -8 (% rbp) <--- Dekrement g addl $ 1, -4 (% rbp) <--- inkrementiere i .L2: cmpl $ 15, -4 (% rbp) <--- vergleiche i mit 15 jle .L3 <---- springe zur nächsten Iteration, wenn kleiner oder gleich
movl $ 0, -4 (% rbp) Movl $ 15, -8 (% Rbp) .L2: subl $ 1, -8 (% rbp) addl $ 1, -4 (% rbp) cmpl $ 15, -4 (% rbp) jle .L2
.file "main_for.c" .section .text.startup, "ax", @ progbits .p2align 4,, 15 .globl main .type main, @function Main: .LFB0: .cfi_startproc rep ret .cfi_endproc .LFE0: .size main,.-main .ident GCC: (Gentoo 4.7.3-r1 p1.4, pie-0.5.5) 4.7.3 .section .note.GNU-stack, "", @ progbits
Main: .LFB0: .cfi_startproc movl $ 15, -4 (% rsp) <----- Berechnete Endbedingung i (cecI) movl $ 16,% eax <------- Unsere Variable g in register .p2align 4,, 10 .p2align 3 .L2: movl -4 (% rsp),% edx <---- verschiebe cecI in ein Register subl $ 1,% edx <--- dekrementiere cecI subl $ 1,% eax <--- dekrementiere g durch Register movl% edx, -4 (% rsp) <- Register nach cecI verschieben jne .L2 rep ret
.LFB0: .cfi_startproc Movl $ 15, -4 (% rsp) movl $ 16,% eax .p2align 4,, 10 .p2align 3 .L2: movl -4 (% rsp),% edx subl $ 1,% edx subl $ 1,% eax movl% edx, -4 (% rsp) jne .L2
int main (int argc, char * argv []) { int x, y; flüchtig g = 0xf; für (y = 0; y <16; y ++) { für (x = 0; x <10; x ++) { G--; } } }
int main (int argc, char * argv []) { int x, y = 0; flüchtig int g = 0xf; für (y = 0; y <16; y ++, x = 0) { while (x ++ <10) { G--; } } }
Main: .LFB0: .cfi_startproc Movl $ 15, -4 (% rsp) Movl $ 16,% Ecx .p2align 4,, 10 .p2align 3 .L2: movl $ 10,% eax .p2align 4,, 10 .p2align 3 .L3: movl -4 (% rsp),% edx subl $ 1,% edx subl $ 1,% eax movl% edx, -4 (% rsp) jne .L3 subl $ 1,% ecx jne .L2
Veröffentlicht am 25-12-2019