Hi ha alguna diferència de velocitat entre les llaçades for-for, while-while, for-while i while-for en C / C ++?
Resposta 1:
int principal (int argc, char * argv []) { int i, g = 0xf; per a (i = 0; i <16; i ++) g--; }
int principal (int argc, char * argv []) { int i = 0, g = 0xf; fer { g--; i ++; } while (i <16); }
int principal (int argc, char * argv []) { int i = 0, g = 0xf; while (i <16) { g--; i ++; }; }
.file "main_for.c" .text .globl principal .tip principal, @funció principal: .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) <--- Tot això per sobre és programminit movl $ 15, -8 (% rbp) <- La nostra variable g movl $ 0, -4 (% rbp) <- La nostra variable i jmp .L2 .L3: subl $ 1, -8 (% rbp) <--- decrement g addl $ 1, -4 (% rbp) <--- increment i .L2: cmpl $ 15, -4 (% rbp) <--- comparar i amb 15 jle .L3 <---- salta a la següent iteració si és menor o igual popq% rbp <----- Tot el que hi ha a continuació és neteja del programa .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size principal,.-principal .ident "GCC: (Gentoo 4.7.3-r1 p1.4, pastís-0.5.5) 4.7.3" .section .note.GNU-stack, "", @ progbits
movl $ 0, -4 (% rbp) <- La nostra variable i movl $ 15, -8 (% rbp) <- La nostra variable g jmp .L2 .L3: subl $ 1, -8 (% rbp) <--- decrement g addl $ 1, -4 (% rbp) <--- increment i .L2: cmpl $ 15, -4 (% rbp) <--- comparar i amb 15 jle .L3 <---- salta a la següent iteració si és menor o igual
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 principal .tip principal, @funció principal: .LFB0: .cfi_startproc rep ret .cfi_endproc .LFE0: .size principal,.-principal .ident "GCC: (Gentoo 4.7.3-r1 p1.4, pastís-0.5.5) 4.7.3" .section .note.GNU-stack, "", @ progbits
principal: .LFB0: .cfi_startproc movl $ 15, -4 (% rsp) <----- Condició final calculada i (cecI) movl $ 16,% eax <------- La nostra variable g al registre .p2align 4,, 10 .p2align 3 .L2: movl -4 (% rsp),% edx <---- trasllada cecI a un registre subl $ 1,% edx <--- decrement cecI subl $ 1,% eax <--- decrement g per registre movl% edx, -4 (% rsp) <- moure el registre a cecI jo .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) jo .L2
int principal (int argc, char * argv []) { int x, y; volàtil g = 0xf; per (y = 0; y <16; y ++) { per (x = 0; x <10; x ++) { g--; } } }
int principal (int argc, char * argv []) { int x, y = 0; int volàtil g = 0xf; per a (y = 0; y <16; y ++, x = 0) { mentre que (x ++ <10) { g--; } } }
principal: .LFB0: .cfi_startproc movl $ 15, -4 (% rsp) movl $ 16,% ecx .p2align 4,, 10 .p2align 3 .L2: 10 $ mobl,% eax .p2align 4,, 10 .p2align 3 .L3: movl -4 (% rsp),% edx subl $ 1,% edx subl $ 1,% eax movl% edx, -4 (% rsp) jo .L3 subl $ 1,% ecx jo .L2
Posat en 25-12-2019