NePo
Gruodis 5, 2006

while vs. for

Vienas žmogus iškėlė klausimą, kuris ciklas while ar for sukasi greičiau, kadangi aš jau rašiau if else vs. switch case, tai negalėjau neatsakyti į šį klausimą.

Teorija

Kažkas yra pasakęs, kad kalba neturinti ciklų negali vadintis programavimo kalba ir jis teisus, nes padaryti, ką nors prasmingo be ciklo yra sunku.
Nors while ciklas yra pats paprasčiausias vis tik norėčiau pradėti nuo kito ciklo pristatymo

for(kintamojo_aprašymas;sąlyga;skaitliukas)
{
veiksmai;
}

kitamojo_aprašymas - priskiriamos pradinės sąlygos kitamajam, sąlyga - nurodoma sąlygos prie kurių vykdomas ciklas, skaitliukas - padidinamas anksčiau apsirašytas kintamasis.
Ankščiau pateiktą pavyzdį labai lengva apsirašyti while ciklu, tuomet kodas atrodys taip:

kintamojo_aprašymas;
while(sąlyga)
{
veiksmai;
skaitliukas;
}

Man asmeniškiai žymiai labiau patinka ciklas for ir kiekviena proga, jeigu tik galima, naudoju for, o ne kurį nors kitą. While cikle labai lengva neapsižiūrėjus pamiršti įdėti skaitliuką ir ciklas suksis amžinai, tuo tarpu for ciklą paversti amžinu reikia šiek tiek talento.
Bet gana tos teorijos, pereikime prie praktikos. Kas greičiau while ar for?

Laiko matavimas

Kaip matuoti laiką aš jau rašiau anksčiau

Ciklo for kodas:

$j=0;
for($i=0;$i<5000000;$i++)
{
$j=$j+1;
}

Kaip matote, ciklas sukamas 5 milijonus kartų, kad nereiktų suktis tuščiam ciklui dar atliekamas vienas sudėties veiksmas.

Analogiškas ciklo while kodas:

$i=0;
$j=0;
while($i<5000000)
{
$i++;
$j=$j+1;
}

Rezultatai:
while

  • 1) 3.68954586983
  • 2) 3.65914916992
  • 3) 3.67162013054

for

  • 1) 3.81086587906
  • 2) 3.83368802071
  • 3) 3.78932094574

Laiko matavimas C#

Įdomu tai, kad paprastomis priemonėmis, bent jau aš neradau kaip pamatuoti didelio tikslumo laiką C# kalboje, todėl laiko matavimui naudosiu Daniel Strigl - High-Performance Timer
Pastaba: sukti ciklus 5 milijonus kartų man pasirodė per mažai, todėl teko pridėti du papildomus nulius.

Ciklo for kodas:

int j = 0;
for (int i = 0; i < 500000000;i++ )
{
j = j + 1;
}

Ciklo while kodas:

int i = 0, j = 0;
while (i < 500000000)
{
i++;
j = j + 1;
}

Rezultatai:
while

  • 1) 1,86262304287277
  • 2) 1,84190057674928
  • 3) 1,8448339104551

for

  • 1) 1,87576940644691
  • 2) 1,91046739180538
  • 3) 1,90075470485774

Išvados

1) ir C# sintaksė labai panaši.
2) Kompiliuojamos kalbos visada greičiau veikia už interpretuojamas.
3) Mes patenkinome savo sportinį azartą ir išsiaiškinome, jog ciklas while yra greitesnis už for, vis tik veikia taip trumpai, jog optimizacijoje naudoti viena ciklą vietoj kito nematau prasmės ir neįsivaizduoju, tokios programos, kuriai reiktų tokių sprendimų.

Nuorodos
PHP while
PHP for

Panašūs straipsniai


“while vs. for” komentarų: 14

  1. Vaidas Žilionis

    Man kazko labiau patinka foreach :)
    ir lyg testuodamas greiciau pasirode freach negu for :)

  2. jungle

    tau aisku neuzteko 7 skaiciu po sekundes kablelio, almantas :D

  3. Pawka

    Kalbant apie PHP’o foreach’us, while’us ir kitų statement’ų benchmarkus: http://www.php.lt/benchmark/phpbench.php

    P.S. Turinys generuojamas dinamiškai, parefrešinkit - pamatysit.

  4. Eimantas

    šiaip for ciklo antraštės dalys vadinasi visai kitaip:

    for (pradžios sąlyga; pabaigos sąlyga; žingsnis)

    Jeigu pas tave “skaitliuke” galima kintamuosius tik didinti, tai matau, kad nelabai daug kur tuos ciklus ir naudoji ir kažko “prasmingo” tikrai nelabai ko esi padaręs.

    Tavo ciklas:

    $j=0;
    for($i=0;$i

  5. Prodiger

    Pryciom cia foreach? Jis visikai skirias nuo for

  6. evll

    Kaz kam nera ka veikti…
    Visu pirma, eksperimento tikslumui, reikia isimti kintamojo inicializacija is for (dumb dumb dumb), prasukti ji ne 3 kartus, o bent jau 10, patestuoti ant ivairiu serveriu.
    Antra, for arba while? Wtf? Kas cia per klausimas? Kartais tinka tas, kartais kitas. O jeigu parodysi man realia web sistema, kuri nuo for pakeitimo i while pastebimai pagreites gali man parasyt (dumb dumb dumb) :)
    Kol kas matau tik dumb dumb dumb testa.

  7. petras

    evil..
    ” optimizacijoje naudoti viena ciklą vietoj kito nematau prasmės ir neįsivaizduoju, tokios programos, kuriai reiktų tokių sprendimų.” (cia is straipsnio)
    nelok jei neperskaitei iki galo dumbdume tu

  8. nkts

    o kur foreach, do-while ?

  9. Kazbekas

    nereikia talento for cikla padaryti amzinu
    for(;;) print ‘amzinai’;

    :D

  10. asterisk

    Kazbekas, vat ir ne :) Pagal default nustatymus tavo skriptą executins tik 30s, arba kol užims visą memory.

  11. Prodiger

    asterisk, bet esme, kad ciklas bus begalinis, o tai kiek laiko ji vykdys cia jau kas kita.

    Vaidas Žilionis, kazko nemanau, kad foreach greiciau, negu for. Beto foreach skirta masyvam, o for - ne tik.

  12. Prodiger

    tiksliau foreach, netgi ne ciklas.

  13. žygis

    for cikle man rodos paskaiciuojama kiek kartu bus vykdomas ciklas ir didina kazkurio kintamojo reiksme, o su while kiekviena kart reikia tikrint ar nepasiekta salyga kuri nutraukia cikla ir plius dar didina kintamaji. as manau tai galetu pasimatyti tik naudojant ciklus kuriu metu atliekama daug darbo ir apdorojama didelis kiekis duomenu. foreach be jokios abejones ne i tema. as asmeniskai jei zinau (arba galiu paskaiciuoti) is anksto kiek kartu reikia prasukti cikla tai naudoju for… ir nelabai reiktu peikti zmogaus jei kazka daro, kai kam tai gali buti naudinga informacija. tarkim irgi yra variantas kas greiciau print ar echo? ats: echo nes yra tiesiogiai asembliuojama, o print yra funkcija, bet manau jei prasuksi tai cikle kazkokio zymaus skirtumo nebus, reiks kada pasibandyt….

  14. Profas

    Man atrodo reikėjo išiimti iš for’o kintamojo inicializacija. Beto manau, kad šitie ciklai nors ir atlieka teoriškai tą patį veiksmą, bet taikomi visai kitose situacijose, todėl jų lyginti ir nereikia, reikia žiurėti pagal situacija.

Rašyti komentarą

Jūs privalote prisijungti jeigu norite rašyti komentarą.