Optimizacija

September 4th, 2005

Na forumih se dostikrat (prevečkrat!) pojavi kakšno vprašanje, ki se tiče optimizacije kode.

Najprej nekaj Resnic, ki jih moraš znati na pamet, preden se lotiš optimizacije:

  1. Resnica št. 1: hardware je cenejši kot programer. Čas je denar. 1GB rama in dodaten procesor sta vredna manj kot 1 plača za programerja.
  2. Resnica št. 2: software optimizira boljše kot človek. Binarni sistem ne sovpada s človeškim načinom razmišljanja. Moderni programski jeziki obvladajo optimizacijo do mere, ki je daleč pred človeškimi sposobnostimi. Še posebej jeziki kot sta php in java.
  3. Resnica št. 3: pregledna in jasna koda je najboljša optimizacija. Kaj ti pomaga koda, ki se izvaja 0.01 sekunde hitreje, če je popolnoma nečitljiva? Kako tako kodo nadgrajuješ?
  4. Resnica št. 4: prezgodnja optimizacija je lahko usodna za projekt. Optimizacija je izguba človeškega časa (glej 1). Prezgodnja optimizacija pomeni optimiziranje delov sistema, ki se še niso izkazali za potrebne optimiziranja, ali še huje – ki jih mogoče ne bo nikoli potrebno optimizirati, ali celo sploh ne bodo nastopali v končnem produktu! Kaj pomaga optimizirana operacija na bazi, če se izvaja samo 1x na mesec?

Nekaj mitov glede PHP optimizacije:

  • Enojni narekovaji so hitrejši kot dvojni narekovaji. Sem spadajo tudi razne razlike med echo $a in echo “$a” … Glej Resnico št. 3. Če dvojni narekovaji pomagajo k preglednosti, moraš uporabiti dvojne narekovaje. Hitrostne razlike so v takih primerih popolnoma zanemarljive.
  • Komentarji upočasnijo izvajanje. Komentarji ne upočasnijo izvajanja kode. Komentarji zvečajo jasnost kode in njeno preglednost in s tem zmanjšajo čas, potreben za urejanje kode. Z modernejšim pristopom, kot je testiranje, pa se potreba po komentiranju celo izrazito zmanjša.
  • print_r je hitrejši kot echo. Ne glede na to, koliko milijonink sekunde profitiraš, nikoli se ne smeš odločati med print_r in echo zaradi pohitritve kode.
  • Objekti so počasnejši kot funkcije. Ja, tud pešec spelje hitreje od avta, prvo sekundo.

Če sem čisto iskren, se v resnici te “optimizacije” res lahko poznajo. Ampak gre za to, da so pohitritve tako majhne, da se praktično skrijejo v primerjavi z enim samim dostopom do neke datoteke. Računalnik je kompleksna zadeva, teče veliko procesov, ki uporabljajo isti disk in čim naš proces ne dobi takoj dostopa do svoje datoteke, je zakasnitev takoj 10x večja kot pohitritev zaradi enojnih narekovajev. Preprosto ne splača se obremenjevati s tako optimizacijo.

Nekaj mest, kjer se splača optimizirati:

  • Dostop do podatkov. V lokalnem sistemu je najpočasnejši dostop do datotek. Baza je v večini primerov precej hitrejša. Zunanji podatki, kot so podatki o vremenu, ki jih črpaš z neke druge strani, so najpočasnejši. Te podatke se splača lokalno začasno shraniti in znova osvežiti samo vsake toliko časa (recimo 1x na uro). Tej metodi se reče caching, zalogi začasno shranjenih podatkov pa cache. Google je tvoj prijatelj. Caching se uporablja na vseh možnih nivojih, v templating sistemih, zunanjih virih podatkov, konfiguracijskih datotekah, itd. Če se ga kje ne splača uporabiti, je to lokalna podatkovna baza. Query na bazo je v 99% primerih hitrejši kot dostop do datoteke.
  • Algoritmi. Optimizacija zahtevnejših algoritmov lahko močno pohitri kodo. Če lahko trojni vgnezdeni for-stavek spremeniš v samo dvojno vgnezdenega, potem je to pravi način, ampak šele, ko algoritem optimizacijo potrebuje (glej Resnice)!
  • Skripte. Optimizacija na nivoju skript prinese, razen pri počasnih virih podatkov (zunanja spletna stran), največji izkoristek. Gre za to, da PHP vsako datoteko najprej prevede v tako imenovano bajtno kodo, ki se potem izvaja. To se zgodi vsakič, ko PHP uporabi neko datoteko. Optimizatorji skript delujejo na principu, ki omogoča keširanje datotek v bajtni kodi, s čimer se prišpara prvo-nivojski prevod, kar lahko pohitri skripte tudi za več desetkrat. Sam uporabljam eAccelerator, ki se obnese zelo dobro.

Za konec še citat:

Premature optimization is the root of all evil. It is important to have sound algorithms and a working prototype first.

Prosti prevod: Prezgodnja optimizacija je koren (jedro, izvor) vsega zla. Pomembno je najprej imeti smiselen algoritem in delujoč prototip.

To je izjavil Tony Hoare (izumitelj quick-sort algoritma za urejanje, zanimivo: interaktivni quick-sort), za njim pa večkrat ponovil Donald Knuth (izumitelj TeX-a).

Več branja:



Comments are closed.