sunnuntai 18. huhtikuuta 2010

For loopin optimointi

[en]

Alla olevissa esimerkeissä käsittelen javan java.util.List tietotyypin implementaatioita, mutta sama toistuu myös monissa muissa erityisesti imperiatiivista syntaksia noudattavissa ohjelmointikielissä, sekä muissa tietotyypeissä kuten taulukoissa, mapeissa yms.

Näemme hyvin usein ohjelmoinnissa, sekä opiskelumateriaaleissa seuraavanlaisia for-looppeja:

for(int i = 0; i < list.size(); i++) {
teeJotain(list.get(i));
}

Esimerkissähän ei sinänsä ole mitään vikaa, mutta jos on mielenkiintoa kirjoittaa optimoitua koodia, kannattaa opetella kirjoittamaan for ( foreach ) looppi seuraavan esimerkin mukaisesti:

for(int i = 0, len = list.size(); i < len; i++) {
teeJotain(list.get(i));
}

Ylemmässä esimerkissä on se vika, että list.size() metodia kutsutaan ennen jokaista iteraatiota vertailun yhteydessä, tämähän voi olla joskus ideanakin jos tiedetään mitä tehdään ja muutetaan listan kokoa iteraatioiden aikana, mutta useimmiten tästä ei ole kyse.. for lausekkeen ensimmäinen osio, joka on pääsääntöisesti ideoitu muuttujien alustukselle, suoritetaan vain kerran, ja täten vertailussa suure tiedetään ja sitä ei tarvitse kysyä uudelleen listalta, joka kuluttaa enemmän prosessoriaikaa.

Noh, hyvin usein listarakenteet ovat aika pieniä, ja saavutettu hyöty suhteellisen minimaalinen, mutta toisaalta toinen syntaksikin on hyvin pieni muutos opetella, ja kerran opittua se tulee suoraan selkärangasta eikä täten aiheuta turhaa päänsärkyä.

Lisäksi lista voi olla myös jollain tapaa dynaaminen, esim. size() metodi voi suorittaa tietokantakyselyn tai mitä hyvänsä, jossa hyöty vain korostuu.

Ei kommentteja:

Lähetä kommentti