Bestum lykkjurnar!

Forrit eyða mestum vinnslutíma sínum inní lykkjum. Því er mikilvægt að besta (optimize) þær, mikill sparnaður vinnst á því og hér eru nokkur einföld ráð til að hraða á vinnslu þeirra.

1. Forðist að nota kall á föll sem útgangspunkt lykkja.

Lykkjur sem nota frumbreytu eins og integer sem útgangspunkt lykkju vinnur að meðaltali 100-150% hraðar en sama lykkja sem notar útkomu úr falli sem útgangspunkt (í java).

Hér eru 2 dæmi sem sýna hvað ég á við:

Dæmi 1: Léleg forritun – Hér er útkoma falls notuð sem útgangspunktur.

for(int i=0; i<str.length(); i++) {
// Kóði sem ekki breytir lengd strengsins str.
}

Dæmi 2: Betri forritun – Hér er integer breyta notuð sem útgangspunktur.

int lengd = str.length();
for(int i=0; i<lengd; i++) {
// Kóði sem ekki breytir lengd str.
}

Í dæmi nr. 2 er svo hægt að ná fram enn betri hagræðingu í java þar sem Java sýndarvélin (JVM) er tjúnnuð til að bera hraðar saman heiltölur frá -1 til +5, er hægt að ná fram enn meiri hraða með því að snúa lykkjunni við og telja niður í núll. Gott væri að fá komment á þetta frá einhverjum c++ gúrú eða úr öðrum forritunarmálum.

For-lykkjan í dæmi 2 liti þá svona út:

For( int i=lengd-1; i>=0; i–)

Í hverri umferð er breytan i borin saman við 0 sem er hraðari samanburður en að bera i saman við breytuna lengd.

2. Notið staðbundnar breytur (local) í stað tilviksbreyta (instance) í lykkjum.

Það að nota breytur sem eru búnar til inní fallinu á undan lykkjunni kosta minni vinnslu en að nota breytu sem tilheyrir einhverjum öðrum hlut (Object eða klasa), því þá sleppur sýndarvélin við það að leita að gildi út fyrir sitt scope (íslenska, einhver?). Tilviksbreytur tilheyra hlutum og því þarf sýndarvélin (í Java) að fletta upp gildinu, fara út fyrir scope fallsins, sem getur verið dýrt.

Dæmi: Ef klasi hefur integer tilviksbreytu sem þarf að setja sem sem index á ákveðið gildi í lista, er gott ráð að skilgreina staðbundna (local) breytu áður en lykkjan er byrjuð. Staðbundna breytan er svo notuð í lykkjunni, samanburður er gerður á fylkinu þar til rétt gildi er fundið, þá er hætt í lykkjunni og staðbundna breytan inniheldur indexinn sem leytað var að. Síðan er tilviksbreytunni gefið gildi staðbundnu breytunnar og verkinu er lokið á mun skemmri tíma.

Í sumum tilfellum, þegar listinn sem skoða á er partur af hlutnum (og því tilviksbreyta), er hraðvirkara að búa til staðbundið afrit af listanum og nota það í lykkjunni til að finna indexinn.

3. Notið break til að enda lykkju ef hægt er.

Ef markmiðum lykkjunnar er náð, notið þá break skipun til að hætta í lykkjunni frekar en að láta hana klára keyrslu fram að útgangspunkti, sú keyrsla er ekki til neins ef markmiðum lykkjunnar er þegar náð, bara tímaeyðsla.

————————————–

Athugið líka að allt annað sem við gerum til að bæta og hraða á forritunum okkar, margfaldast þegar komið er í lykkjur, og ferillinn er sennilega ekki línulegur!

Við verðum alltaf að taka smá tíma extra til að besta lykkjur því það borgar sig ansi hratt upp.

Meira síðar.

massi