Postoji li razlika u brzini između za-za, dok, dok, za vrijeme i dok-za ugniježđene petlje u C / C ++?
Odgovor 1:
int glavni (int argc, char * argv []) { int i, g = 0xf; za (i = 0; i <16; i ++) g--; }
int glavni (int argc, char * argv []) { int i = 0, g = 0xf; čini { g--; i ++; } while (i <16); }
int glavni (int argc, char * argv []) { int i = 0, g = 0xf; dok je (i <16) { g--; i ++; }; }
.file "main_for.c" .tekst .globl glavni .tip glavni, @funkcija glavni: .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) <--- Sve iznad toga je programirano movl $ 15, -8 (% rbp) <- Naša varijabla g movl $ 0, -4 (% rbp) <- Naša varijabla i jmp .L2 .L3: subl $ 1, -8 (% rbp) <--- decrement g addl $ 1, -4 (% rbp) <--- prirast i .L2: cmpl $ 15, -4 (% rbp) <--- usporedite i sa 15 jle .L3 <---- skok na sljedeću iteraciju ako je manja ili jednaka popq% rbp <----- Sve ispod ovog programa je čišćenje programa .cfi_def_cfa 7, 8 u mirovini .cfi_endproc .LFE0: .size glavni,.-glavni .ident "GCC: (Gentoo 4.7.3-r1 p1.4, pita-0.5.5) 4.7.3" .sekcija .note.GNU-stog, "", @ napreduje
movl $ 0, -4 (% rbp) <- Naša varijabla i movl $ 15, -8 (% rbp) <- Naša varijabla g jmp .L2 .L3: subl $ 1, -8 (% rbp) <--- decrement g addl $ 1, -4 (% rbp) <--- prirast i .L2: cmpl $ 15, -4 (% rbp) <--- usporedite i sa 15 jle .L3 <---- skok na sljedeću iteraciju ako je manja ili jednaka
movl 0, -4 (% rbp) movl 15 USD -8 (% rbp) .L2: subl 1, -8 (% rbp) addl $ 1,44 (% rbp) cmpl $ 15, -4 (% rbp) jle .L2
.file "main_for.c" .sekcija .text.startup, "sjekira", @ napreduje .p2poravna 4,, 15 .globl glavni .tip glavni, @funkcija glavni: .LFB0: .cfi_startproc rips u mirovini .cfi_endproc .LFE0: .size glavni,.-glavni .ident "GCC: (Gentoo 4.7.3-r1 p1.4, pita-0.5.5) 4.7.3" .sekcija .note.GNU-stog, "", @ napreduje
glavni: .LFB0: .cfi_startproc movl 15, -4 (% rsp) <----- Izračunato krajnje stanje i (cecI) movl $ 16,% eax <------- Naša varijabla g u registru .p2align 4,, 10 .p2poravna 3 .L2: movl -4 (% rsp),% edx <---- premjesti cecI u registar subl $ 1,% edx <--- decrement cecI subl $ 1,% eax <--- decrement g po registru movl% edx, -4 (% rsp) <- premjestite se u cecI jne .L2 rips u mirovini
.LFB0: .cfi_startproc movl 15, -4 (% rsp) movl $ 16,% eax .p2align 4,, 10 .p2poravna 3 .L2: movl -4 (% rsp),% edx subl $ 1,% edx subl $ 1,% eax movl% edx, -4 (% rsp) jne .L2
int glavni (int argc, char * argv []) { int x, y; isparljivi g = 0xf; za (y = 0; y <16; y ++) { za (x = 0; x <10; x ++) { g--; } } }
int glavni (int argc, char * argv []) { int x, y = 0; isparljivi int g = 0xf; za (y = 0, y <16; y ++, x = 0) { dok je (x ++ <10) { g--; } } }
glavni: .LFB0: .cfi_startproc movl 15, -4 (% rsp) movl $ 16,% ecx .p2align 4,, 10 .p2poravna 3 .L2: movl $ 10,% eax .p2align 4,, 10 .p2poravna 3 .L3: movl -4 (% rsp),% edx subl $ 1,% edx subl $ 1,% eax movl% edx, -4 (% rsp) jne .L3 subl $ 1,% ecx jne .L2
Objavljeno 25-12-2019