while (1) Vs. (;;) bir hız farkı var mı? | Netgez.com
SORU
20 Mayıs 2009, ÇARŞAMBA


while (1) Vs. (;;) bir hız farkı var mı?

Uzun versiyonu...

Co-işçi bir for (;;) daha hızlı olduğunu Perl programı while (1) zaman kullanımını gördükten sonra bugün ileri sürdü. Yorumlayıcı herhangi bir farklılık optimize dışarı umuduyla aynı olması gerektiğini savundu. Yukarı döngü yineleme ve döngüler aynı sayıda için 1,000,000,000 çalıştırın ve arasında bu kez rekor bir senaryo kurdum. Kayda değer bir fark bulamadım. Meslektaş benim bir profesör while (1) 5* *karşılaştırma ve for (;;) yaptığını söylemiş " dedi. C ile yineleme ve fark sayısı yok denecek kadar azdı, 100 kez aynı testi tekrar ettik. Ancak daha hızlı derlenmiş kod betik dili vs ne kadar çarpıcı bir örnek oldu.

Kısa versiyonu...

Herhangi bir nedenle eğer kaçmaya sonsuz bir döngüye ihtiyacın olursa for (;;) while (1) bir tercih var mı?

Not:Soru net değil. Bu sadece birkaç arkadaş arasında eğlenceli akademik bir tartışma oldu. Bu tüm programcılar üzerinde işkence gereken çok önemli bir kavram değil farkındayım. Hepsi harikaydı ben (ve eminim diğerleri) bu tartışma bir kaç şey öğrendim cevaplar.

Güncelleme:Meslektaş anılan bir yanıt aşağıda ağırlığını koydu.

Yanıyorlar diye alıntı burada.

AMD montaj programcı geldi. C programcıları belirtti (insanlar) kendi kod verimsiz farkında değilsiniz. Dedi bugün olsa, gcc Derleyiciler çok iyi, ve onun gibi insanlar söndürüldü iş. Örneğin, dedi, ve while 1 vs bahsetti for(;;). Şimdi alışkanlık ama gcc ve özellikle tercümanlar dışında kullanıyorum aynı işlemi (işlemci atlama) bu gün için yapacak optimize edilmiş olduğundan beri.

CEVAP
20 Mayıs 2009, ÇARŞAMBA


Perl, aynı işlem sonucu:

$ perl -MO=Concise -e 'for(;;) { print "foo\n" }'
a  <@> leave[1 ref] vKP/REFC ->(end)
1     <0> enter ->2
2     <;> nextstate(main 2 -e:1) v ->3
9     <2> leaveloop vK/2 ->a
3        <{> enterloop(next->8 last->9 redo->4) v ->4
-        <@> lineseq vK ->9
4           <;> nextstate(main 1 -e:1) v ->5
7           <@> print vK ->8
5              <0> pushmark s ->6
6              <$> const[PV "foo\n"] s ->7
8           <0> unstack v ->4
-e syntax OK

$ perl -MO=Concise -e 'while(1) { print "foo\n" }'
a  <@> leave[1 ref] vKP/REFC ->(end)
1     <0> enter ->2
2     <;> nextstate(main 2 -e:1) v ->3
9     <2> leaveloop vK/2 ->a
3        <{> enterloop(next->8 last->9 redo->4) v ->4
-        <@> lineseq vK ->9
4           <;> nextstate(main 1 -e:1) v ->5
7           <@> print vK ->8
5              <0> pushmark s ->6
6              <$> const[PV "foo\n"] s ->7
8           <0> unstack v ->4
-e syntax OK

GCC aynı şekilde:

#include <stdio.h>

void t_while() {
    while(1)
    	printf("foo\n");
}

void t_for() {
    for(;;)
    	printf("foo\n");
}

    .file   "test.c"
    .section    .rodata
.LC0:
    .string "foo"
    .text
.globl t_while
    .type   t_while, @function
t_while:
.LFB2:
    pushq   %rbp
.LCFI0:
    movq    %rsp, %rbp
.LCFI1:
.L2:
    movl    $.LC0, íi
    call    puts
    jmp .L2
.LFE2:
    .size   t_while, .-t_while
.globl t_for
    .type   t_for, @function
t_for:
.LFB3:
    pushq   %rbp
.LCFI2:
    movq    %rsp, %rbp
.LCFI3:
.L5:
    movl    $.LC0, íi
    call    puts
    jmp .L5
.LFE3:
    .size   t_for, .-t_for
    .section    .eh_frame,"a",@progbits
.Lframe1:
    .long   .LECIE1-.LSCIE1
.LSCIE1:
    .long   0x0
    .byte   0x1
    .string "zR"
    .uleb128 0x1
    .sleb128 -8
    .byte   0x10
    .uleb128 0x1
    .byte   0x3
    .byte   0xc
    .uleb128 0x7
    .uleb128 0x8
    .byte   0x90
    .uleb128 0x1
    .align 8
.LECIE1:
.LSFDE1:
    .long   .LEFDE1-.LASFDE1
.LASFDE1:
    .long   .LASFDE1-.Lframe1
    .long   .LFB2
    .long   .LFE2-.LFB2
    .uleb128 0x0
    .byte   0x4
    .long   .LCFI0-.LFB2
    .byte   0xe
    .uleb128 0x10
    .byte   0x86
    .uleb128 0x2
    .byte   0x4
    .long   .LCFI1-.LCFI0
    .byte   0xd
    .uleb128 0x6
    .align 8
.LEFDE1:
.LSFDE3:
    .long   .LEFDE3-.LASFDE3
.LASFDE3:
    .long   .LASFDE3-.Lframe1
    .long   .LFB3
    .long   .LFE3-.LFB3
    .uleb128 0x0
    .byte   0x4
    .long   .LCFI2-.LFB3
    .byte   0xe
    .uleb128 0x10
    .byte   0x86
    .uleb128 0x2
    .byte   0x4
    .long   .LCFI3-.LCFI2
    .byte   0xd
    .uleb128 0x6
    .align 8
.LEFDE3:
    .ident  "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
    .section    .note.GNU-stack,"",@progbits

Cevap sanırım bu yüzden, birçok derleyici aynı. Elbette, diğer bazı Derleyiciler bu olabilir mutlaka, ama bir ihtimal, kod içinde döngü olacak bir kaç bin kat daha pahalı daha döngü kendini her neyse, kimin umurunda?

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VÄ°DEO

Rastgele Yazarlar

  • AndroidSale

    AndroidSale

    17 NÄ°SAN 2011
  • Benjamin Heckendorn

    Benjamin Hec

    4 Mayıs 2008
  • Pepsi

    Pepsi

    1 Kasım 2005