(1) Vs. for (;;) Hız farkı var mı?


154

Uzun versiyon...

Bir iş arkadaşı , daha hızlı while (1)olan bir Perl betiğindeki kullanımımı gördükten sonra bugün iddia etti for (;;). Tercümanın herhangi bir farkı optimize etmesi umuduyla aynı olmaları gerektiğini savundum. Döngü yinelemeleri için 1.000.000.000 çalıştıracak ve aynı sayıda döngüler çalıştıracak ve arasındaki süreyi kaydedecek bir komut dosyası ayarladım. Kayda değer bir fark bulamadım. İş arkadaşım bir profesörün ona while (1)bir karşılaştırma yaptığını 1 == 1ve for (;;)olmadığını söylediğini söyledi . Aynı testi C ++ ile 100x yineleme sayısıyla tekrarladık ve fark ihmal edilebilir düzeydeydi. Bununla birlikte, bir derleme koduna karşı derlenmiş kodun ne kadar hızlı olabileceğinin grafik bir örneğiydi.

Kısa versiyon...

Eğer kaçmak için sonsuz bir döngüye ihtiyacınız varsa bir while (1)fazla tercih etmek için herhangi bir neden var mı for (;;)?

Not: Sorudan net değilse. Bu, birkaç arkadaş arasında tamamen eğlenceli bir akademik tartışma oldu. Bunun, tüm programcıların acı çekmesi gereken çok önemli bir kavram olmadığının farkındayım. Tüm bu harika cevaplar için teşekkürler (ve eminim diğerleri) bu tartışmadan birkaç şey öğrendim.

Güncelleme: Sözü edilen iş arkadaşı aşağıda bir yanıtla tartıldı.

Gömülmesi durumunda burada alıntılanmıştır.

Bir AMD montaj programcısından geldi. C programcılarının (insanlar) kodlarının verimsiz olduğunu anlamadıklarını belirtti. Ancak bugün, gcc derleyicilerinin çok iyi olduğunu ve onun gibi insanları işten çıkardığını söyledi. Örneğin dedi ve bana while 1vs hakkında söyledi for(;;). Şimdi alışkanlık dışında kullanıyorum ama gcc ve özellikle tercümanlar optimize edildiğinden, her iki gün için de aynı işlemi (işlemci atlama) yapacaklar.


4
Merak ediyorum. Neden perl betiğinde sonsuz döngüye ihtiyaç duyulur? Açıkçası bir sürücü ya da sistem şeyi programlamıyorsunuz ... Sonsuz sessiz uzun :-)
Luc M

125
Hangi sonsuz döngü en hızlı? LOL ... "Yeni bilgisayarım çok hızlı, bir saatin altında sonsuz bir döngü yapıyor ..." ;-)
Arjan Einbu 20:09

8
Ona bunu söyleyen bir sosyoloji profesörü müydü? Modern çağda, yazdığınız kod bilgisayarın göreceği şey değildir.
brian d foy

5
Bu test etmek için gereken zaman miktarı, hangisinin daha hızlı olduğunu bilerek potansiyel olarak tasarruf edilen zamanın çok daha uzun olduğunu umuyorum. her iki programlama ömründe de amortismana rağmen.
Peter Recore

4
Derleyici, hiçbir yan etkisi olmadığını ve derleyicinin zaten bildiği bir testi gerçekleştirmek için neden kod oluştursun? Bu hiç mantıklı değil.
David Schwartz

Yanıtlar:


218

Perl'de aynı opcode neden olurlar:

$ 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

Aynı şekilde GCC'de:

#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, %edi
    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, %edi
    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

Yani sanırım cevap, birçok derleyicide aynı. Tabii ki, diğer bazı derleyiciler için durum böyle olmayabilir, ancak döngü içindeki kod zaten döngüden birkaç bin kat daha pahalı olacak, bu yüzden kimin umurunda?


15
B ile deneyin :: Deparse, loop için sonsuz bir ayrılma bir süre döngü döndürür: P
Kent Fredric

27
“Perl'de aynı opcode neden oluyorlar ... ... evet, ama hangisi daha hızlı? :-)
Tin Man

6
Ben sadece tek bir argüman ve bu nedenle biçimlendirecek hiçbir şey - daha hızlı ve daha güvenli olduğundan, gcc yerine koyar () printf () için seviyorum! (gcc ayrıca biçimlendirme etiketlerini değişken argüman listesine göre kontrol eder.)
Lee D

@Teneke Adam: eşdeğerler, çünkü bilgisayar aynı işlemleri yapıyor: P
BlackBear

1
@snap, 'tamamen' yanlış değil, sadece çalışma zamanı maliyetlerine odaklanıyor. Ne tür bir durumun sonsuz döngülerin ayrıştırma süresinin, programınızın ne kadar hızlı çalıştığındaki kilit karar faktörü olmasıyla sonuçlanacağını hayal edemiyorum
bdonlan 22

55

GCC kullanarak, her ikisi de aynı montaj dilini derliyor gibi görünüyor:

L2:
        jmp     L2

20
-S seçeneğiyle GCC kullanma (birleştirme, bağlama)
Martin Cote

54

Birini diğerine tercih etmek için fazla bir neden yok. Bence while(1)özellikle while(true)daha okunabilir for(;;), ama bu sadece benim tercihim.


94
#define EVER ;; (EVER) için hep böyle eğlenceli buluyorum.
Tom

19
#Define sonsuza dek (;;) sonsuza kadar;
Martin Cote

17
Her ikisi de yüzeyde daha okunabilir görünüyor, ancak bakım programcımın (genellikle ben) kafasını çizmek için yeni anahtar kelimeler tanımlamamaya çalışıyorum.
Kertenkele Bill

13
@Martin çalışmaz, çünkü # define bir jetonun yerine geçmez ve foreverkendi jetonudur.
Lily Chung

2
"Bakımım için yeni anahtar kelimeler tanımlamamaya çalışıyorum" - sadece daha fazla insan bu tutumu ele geçirseydi, her döndüğümde tüm bu inane ve sihirli el çabukluğu maskaralıklarına tutunmazdım!
tchrist

32

Standarda göre hiçbir fark yoktur. 6.5.3 / 1 aşağıdakilere sahiptir:

For ifadesi

for ( for-init-statement ; conditionopt ; expressionopt ) statement

eşittir

{
  for-init-statement
  while ( condition ) {
    statement
    expression ;
  }
}

Ve 6.5.3 / 2'de şunlar var:

Koşulun ve ifadenin biri veya her ikisi de atlanabilir. Eksik bir koşul, ima edilen while deyiminin while (true) ifadesine eşdeğer olmasını sağlar.

C ++ standardına göre kod:

for (;;);

tam olarak aynıdır:

{
  while (true) {
    ;
    ;
  }
}

4
Bu, oluşturulan kod veya performansla ilgili değildir. Standart yalnızca işlevselliği tanımlar. Tabii ki, performans aynı olacak.
Potatoswatter

1
Performanstaki farklılığın as-if kuralını ihlal ettiğine inanmıyorum. Öyleyse, derleyicilerin kodunuzu as-if kuralıyla hızlandırmasına izin verilmez, örneğin bağımsız ifadeleri yeniden sipariş ederek. Derleyiciler aslında tam olarak bunu yapar. Ama standardın kopyası benim yukarıda.
Steve Jessop

28

Visual C ++ derleyicisi için uyarı yaymak için kullanılır

while (1) 

(sabit ifade) için değil

for (;;)

for (;;)Bu nedenle tercih etme pratiğine devam ettim , ancak derleyicinin bu günlerde hala bunu yapıp yapmadığını bilmiyorum.


uyarı büyük olasılıkla while (true) yerine (1) kullanılırken kullanılır
jrharshath

16
true bir sabittir. while (true) ifadesi sabit bir ifadedir. İlgilenenler için C4127 uyarısı burada belgelenmiştir: msdn.microsoft.com/en-us/library/6t66728h(VS.80).aspx
sean e

Evet, uyarı hem 1 hem de doğru için hala mevcuttur. Bu yüzden (;;) için her zaman kullanmamın nedeni
Elviss Strazdins

26

for(;;) bir şeyleri optimize etmek için bu yönde gitmek istiyorsanız yazmak için daha az karakterdir.


21
Golf için bilmek güzel. Aksi takdirde bir sözdizimi seçmek için kötü bir neden.
Adam Bellaire

@AdamBellaire Terseness genellikle okunabilirliği belirli bir beceri eşiğinin üzerine çıkarır.
Vektör Gorgoth

20

Bu eski derleyicilere sahip Turbo C for(;;), daha hızlı kod sağlar while(1).

Bugün gcc, Visual C (sanırım neredeyse hepsi) derleyiciler iyi optimize eder ve 4.7 MHz'lik CPU'lar nadiren kullanılır.

O günlerde a for( i=10; i; i-- )daha hızlıydı for( i=1; i <=10; i++ ), çünkü karşılaştırma i0 olduğundan, CPU-Zero-Flag koşullu Jump ile sonuçlanır. Ve Sıfır Bayrağı son azaltma işlemiyle değiştirildi ( i-- ), fazladan bir cmp işlemine gerek yok.

    call    __printf_chk
    decl    %ebx          %ebx=iterator i 
    jnz     .L2
    movl    -4(%ebp), %ebx
    leave

ve burada for(i=1; i<=10; i++)ekstra cmpl ile:

    call    __printf_chk
    incl    %ebx
    cmpl    $11, %ebx
    jne     .L2
    movl    -4(%ebp), %ebx
    leave

13

Tüm insanlar açık kullanarak while döngüleri indefinte kullanmamalısınız savunarak ve benzeri aptal şeyler düşündüren için goto ifadesi 'ın (gerçekten, ah)

while (1) {
     last if( condition1 );
     code();
     more_code(); 
     last if( condition2 ); 
     even_more_code(); 
}

Gerçekten başka hiçbir şekilde etkili bir şekilde temsil edilemez. Bir çıkış değişkeni oluşturmadan ve senkronize tutmak için kara büyü yapmadan olmaz.

Daha goto-esque sözdizimi için bir tutkunuz varsa, kapsamı sınırlayan aklı başında bir şey kullanın.

flow: { 

   if ( condition ){ 
      redo flow;
   }
   if ( othercondition ){ 
       redo flow;
   }
   if ( earlyexit ){ 
       last flow;
   }
   something(); # doesn't execute when earlyexit is true 
}

Sonuçta Hız o kadar önemli değil

Farklı döngü yapılarının hız açısından ne kadar etkili olduğu konusunda endişe etmek büyük bir zaman kaybıdır. Aracılığıyla erken optimizasyon. Profil oluşturma kodunun döngü oluşturucu seçimimde darboğazlar bulduğunu gördüğüm herhangi bir durumu düşünemiyorum.

Genellikle döngü nasıl ve döngü ne .

Okunabilirlik ve özlü olma için "optimize etmelisiniz" ve sorunu açıklayan en iyi olanı kodunuzu bulan bir sonraki kötü emiciye yazmalısınız.

Bahsedilen "goto LABEL" numarasını kullanırsanız ve kodunuzu kullanmam gerekiyorsa, özellikle bir kereden fazla yaparsanız, bir gözü açık olarak uyumaya hazır olun, çünkü bu tür şeyler yaratır korkunç spagetti kodu .

Eğer sırf yapabilirsiniz spagetti oluşturmak kod size anlamına gelmez should


9

Stroustrup'tan, TC ++ PL (3. baskı), §6.1.1:

Meraklı gösterim for (;;), sonsuz bir döngü belirtmenin standart yoludur; "sonsuza dek" telaffuz edebilirsin. [...] while (true)bir alternatiftir.

Ben tercih ederim for (;;).


9

Derleyici herhangi bir optimizasyon yapmazsa, for(;;)her zamankinden daha hızlı olurwhile(true) . Bunun nedeni while-ifadesinin durumu her zaman değerlendirmesidir, ancak for-ifadesi koşulsuz bir sıçramadır. Ancak derleyici kontrol akışını optimize ederse, bazı opodlar üretebilir. Sökme kodunu çok kolay okuyabilirsiniz.

PS böyle sonsuz bir döngü yazabilirsiniz:

#define EVER ;;
  //...
  for (EVER) {
    //...
  }

Modern gün ve yaşta hiç EVS (genç konuşma) ile değiştirilmemelidir! Cidden sadece (;;) {} için kullanıyorum. Uzun zaman önce ikisi arasındaki farkları (daha küçükken ve aslında aynı olduklarını bilmiyordum) hakkında uzun süre çevrimiçi okudum ve okuduğum şeyle sıkışıp kaldım.
Bja

8

Bunu bir kez duydum.

Bir AMD montaj programcısından geldi. C programcılarının (insanlar) kodlarının verimsiz olduğunu anlamadıklarını belirtti. Ancak bugün, gcc derleyicilerinin çok iyi olduğunu ve onun gibi insanları işten çıkardığını söyledi. Örneğin dedi ve bana while 1vs hakkında söyledi for(;;). Şimdi alışkanlık dışında kullanıyorum ama gcc ve özellikle tercümanlar optimize edildiğinden, her iki gün için de aynı işlemi (işlemci atlama) yapacaklar.


5

Derlenmiş bir dilin optimize edilmiş bir yapısında, ikisi arasında kayda değer bir fark olmamalıdır. İkisi de çalışma zamanında herhangi bir karşılaştırma yapmamalıdır, döngüden manuel olarak çıkana kadar döngü kodunu yürütürler (örneğin a ile break).


3

Kimsenin perl'e for (;;)karşı düzgün bir şekilde test edilmemesine şaşırdım while (1)!

Perl yorumlanmış dil olduğundan, perl betiğini çalıştırma süresi yalnızca yürütme aşamasından (bu durumda aynıdır) değil, aynı zamanda yürütmeden önceki yorumlama aşamasından oluşur. Hız karşılaştırması yapılırken bu aşamaların her ikisi de dikkate alınmalıdır.

Neyse ki perl, aşağıdaki gibi bir ölçüt uygulamak için kullanabileceğimiz kullanışlı bir Benchmark modülüne sahiptir:

#!/usr/bin/perl -w

use Benchmark qw( cmpthese );

sub t_for   { eval 'die; for (;;) { }'; }
sub t_for2  { eval 'die; for (;;)  { }'; }
sub t_while { eval 'die; while (1) { }'; }

cmpthese(-60, { for => \&t_for, for2 => \&t_for2, while => \&t_while });

Sonsuz for döngüsünün iki farklı versiyonunu test ettiğime dikkat edin: biri while döngüsünden daha kısa ve diğeri while döngüsü ile aynı uzunlukta yapmak için fazladan bir alana sahip.

Perl 5.10.1 ile Ubuntu 11.04 x86_64 üzerinde Aşağıdaki sonuçları elde ediyorum:

          Süre için oran2
100588 / s için -% -0% -2
for2 100937 / s% 0 -% -1
102147 / s% 2% 1 -

While döngüsü bu platformda açıkça kazanıyor.

Perl 5.14.1 ile FreeBSD 8.2 x86_64'te:

         Süre için oran2
53453 / s için -% -0% -2
for2 53552 / s% 0 -% -2
54564 / s% 2% 2 -

Döngü de burada kazanan.

Perl 5.14.1 ile FreeBSD 8.2 i386'da:

         For2 için oy ver
24311 / s -% -1 -1%
24481 / s için% 1 -% -1
for2 24637 / s% 1% 1 -

Şaşırtıcı bir şekilde ekstra bir alana sahip for döngüsü burada en hızlı seçimdir!

Sonuç olarak, programcı hız için optimizasyon yapıyorsa while döngüsü x86_64 platformunda kullanılmalıdır. Açıkçası alan için optimizasyon yaparken bir for döngüsü kullanılmalıdır. Sonuçlarım maalesef diğer platformlarla ilgili olarak net değil.


9
Sonuç açık bir şekilde yanlıştır. Benchmarksınırlamaları vardır ve sonuçlar birbirinin% 7'sinde ise hızlıdan yavaştan ayırt etmek için kullanılamaz. Ayrıca, forve whiledöngüler arasındaki farkı test etmediniz, çünkü her alt diedöngü döngüye ulaşmadan önce olacaktır . Ve beyaz alan miktarı Perl yorumlayıcısının ne zamandan beri önemliydi? Üzgünüm, ama analiz son derece hatalı.
Zaid

2
@Zaid, Yorumlarınız için teşekkürler! Herkesin bundan öğrenebilmesi için kendi cevabınızı göndermeyi düşünür müsünüz? :) dieBenim kod orada çünkü niyetim sadece derleme zaman farkı test etmektir . Diğerlerinin daha önce işaret ettiği gibi, sonuçtaki bayt kodu aynıdır, bu yüzden bunu test etmenin bir anlamı yoktur. Şaşırtıcı bir şekilde, bu durumda test ortamlarımda beyaz boşluk miktarı küçük bir fark yaratıyor gibi görünüyor. Bu ... karakterler sona nasıl bir ilgisi belleğe ya da bir şey benzer hizalanmış alma olabilir
ek bileşeni

4
Cevap göndermeme gerek yok çünkü söyleyeceğim şey bdonlan tarafından zaten belirtilmişti. Derleme zamanlarını karşılaştırsanız bile Benchmark, sonuçsuz sayılar . % 1 farkına hiç güvenmeyin!
Zaid

Sadece 60 yineleme? Daha doğru göreceli süreler elde etmek için testleri yaklaşık 5 dakika çalıştırın.
Mooing Duck

-60testi 60 saniye boyunca yürütür.
ek bileşeni

2

Teorik olarak, tamamen naif bir derleyici, '1' hazır bilgisini ikili dosyada (israf boşluğu) saklayabilir ve her yinelemede 1 == 0 olup olmadığını (israf süresi ve daha fazla alan) kontrol edebilir.

Ancak gerçekte, "hayır" optimizasyonlarında bile, derleyiciler her ikisini de aynı şekilde azaltacaktır. Ayrıca mantıklı bir hataya işaret edebileceğinden uyarılar yayınlayabilirler. Örneğin, argümanı whilebaşka bir yerde tanımlanabilir ve bunun sabit olduğunu fark edemezsiniz.


2

Kimsenin istenen düzene karşılık gelen daha doğrudan bir form sunmadığına şaşırdım:

forever:
     do stuff;
     goto forever;

1 ile aynı makine koduyla bitmeyen veya c;
Copas

1
Bu yaklaşımın bir diğer eksikliği: döngüyü bir blok içine yerleştirmeyerek kapsüllemeyi ihlal eder - böylece döngüde bildirilen değişkenler döngü dışında kullanılabilir. (Tabii ki yapabilirsiniz { forever: do stuff; goto forever; })
Roy Tinker

2

while(1)for(;;)çoğu derleyici tarafından tanınan bir deyimdir .

Perl'in de tanıdığını gördüğüme sevindim until(0).


Hangi durumda (0) tarihine kadar yardımcı olur?
Copas

3
(), while () öğesinin tam tersi ise, (), if () öğesinin tersi gibi. (! Koşul): Bu Konuda eslewhere önerildiği gibi bir yazabiliriz alternatif kadar olabilmekle birlikte {... birşeyler} do (koşul) {şey}
JMD

2

for (;;)Vs while (1)tartışmasını özetlemek için , eski optimize olmayan derleyiciler günlerinde daha hızlı olduğu açıktır, bu yüzden bunu Lions Unix Kaynak kodu yorumu gibi eski kod tabanlarında görme eğilimindedir, ancak badass optimizasyon çağında derleyiciler bu kazançlar, ikincisinin anlaşılması daha kolay olduğu gerçeği ile birleştiğinde optimize edildiğine inanıyorum.


2

Sadece bu iplik geldi (oldukça birkaç yıl geçmesine rağmen).

"For (;;)" nin "while (1)" den daha iyi olmasının gerçek nedenini bulduğumu düşünüyorum.

"barr kodlama standardı 2018" e göre

Kernighan & Ritchie long ago recommended for (;;) , which has the additional benefit
of insuring against the visually-confusing defect of a while (l); referencing a variable l’.

temel olarak, bu bir hız sorunu değil, okunabilirlik sorunudur. Kodun yazı tipine / baskısına bağlı olarak, bir süre (1) küçük harf l gibi görünebilir.

yani 1'e karşı l. (bazı fontlarda bunlar aynı görünür).

Bu yüzden (1), L harfi değişken harfine bağlıyken döngü gibi görünebilir.

while (true) da işe yarayabilir ancak bazı eski C ve gömülü C durumlarında stdbool.h dahil edilmedikçe true / false henüz tanımlanmamıştır.


2
Kodunuzdaki sorun, adlandırılmış bir değişkene sahip olacaksınız l, buna benzemez 1ve lbenzer görünebilir.
mjuopperi

Kabul ediyorum, Barr kodlama standardının başka yerlerde de döngüler için bile değişkenlerin en az 3 karakter olması gerektiğini söylediğini biliyorum. yani bir i döngüsünde i ++ vb. yok. Bunun biraz fazla olabileceğini düşünüyorum. Yazarken aynı zamanda 1'e benzeyen sadece L harfi de değil, genellikle değişken olarak kullanılan i harfi de sorunlara neden olabilir.
Nick Law

-3

Her ikisinin de performans açısından aynı olduğunu düşünürdüm. Ancak okunabilirlik için (1) 'i tercih ederim ama neden sonsuz bir döngüye ihtiyacınız olduğunu soruyorum.


-14

Onlar aynı. Düşünmek için çok daha önemli sorular var.


Demek istediğim, ancak yukarıda açıkça belirtilmeyen, iyi bir derleyicinin her iki döngü formu için de aynı kodu üreteceğidir. Daha büyük nokta, döngü yapısının herhangi bir algoritmanın çalışma süresinin küçük bir parçası olması ve önce algoritmayı ve bununla ilgili diğer her şeyi optimize ettiğinizden emin olmanız gerekir. Döngü yapınızı optimize etmek kesinlikle öncelik listenizin altında olmalıdır.


22
Bağlantı veya açıklama yok. Yararsız, öznel ve biraz küçümseyici.
cdmckay

1
kanıt yok ama haklı. Her ikisi de yanlış olduğunda atlama için Opcode'u çağırır. (goto ile aynı olur ama kimse gotos'u sevmez)
Matthew Whited

3
Nerede sorulabileceğimin sadece önemli sorularının benim hatamın ilk sorum olduğunu bilmiyordum.
Copas

3
Evet, küçümseyici olduğunu itiraf ediyorum. Ama cidden, herhangi bir kanıt olmadan bile, aynı top parkında süratli olacakları açıktır; eğer soru stil ile ilgili olsaydı, tartışılması gereken bir şey olurdu. Endişelenecek şeyler listesinde bunun gerçekten listenin en altında olması gerektiğine dikkat çekmeye çalışıyordum.
Mark Ransom

8
Ben pislik olmaya çalışmıyordum. Bir noktaya değinmeye çalışıyordum. Gönderdiğimde bir tür kara mizah için çalışıyordum ve başarısız olduğum ortada; bunun için özür dilerim.
Mark Ransom
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.