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 PHP
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) PHP 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 ciklai veikia taip trumpai, jog optimizacijoje naudoti viena ciklą vietoj kito nematau prasmės ir neįsivaizduoju, tokios programos, kuriai reiktų tokių sprendimų.
2006-12-05 | 9:10
Man kazko labiau patinka foreach :)
ir lyg testuodamas greiciau pasirode freach negu for :)
2006-12-05 | 11:31
tau aisku neuzteko 7 skaiciu po sekundes kablelio, almantas :D
2006-12-05 | 13:48
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.
2006-12-05 | 16:15
š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
2007-02-24 | 17:08
Pryciom cia foreach? Jis visikai skirias nuo for
2007-03-15 | 17:46
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.
2007-03-29 | 13:08
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
2007-05-03 | 20:07
o kur foreach, do-while ?
2007-08-10 | 0:56
nereikia talento for cikla padaryti amzinu
for(;;) print ‘amzinai’;
:D
2007-08-10 | 8:19
Kazbekas, vat ir ne :) Pagal default nustatymus tavo skriptą executins tik 30s, arba kol užims visą memory.
2008-04-24 | 14:18
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.
2008-04-24 | 14:44
tiksliau foreach, netgi ne ciklas.
2008-05-30 | 22:54
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….
2008-06-16 | 2:20
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.