Nedidelis PHP skripto pagreitinimas paprastais būdais

PHP kalba yra šiuo metu viena populiariausių web-programavimo technologijų. Ji pakankamai lengvai įkandama, kai realiai užtenka bazinių HTML, PHP ir MySQL žinių, ir jau praktiškai gali kurti tinklapius. Bet kai kur reikia ne tik mokėti juos kurti, o ir juos optimizuoti, kad puslapiai krautųsi greičiau. Krovimosi lėtumą gali sąlygoti labai daug veiksnių, tačiau šiame straipsnyje papasakosiu apie 3 labai paprastus būdus pagreitinti PHP skripto veikimo laiką.

Visiems trims patarimams atlikau testus savo lokaliame kompiuteryje ir paskaičiavau skriptų veikimo laiką be optimizavimo ir su optimizavimu. Galbūt paprastiems tinklapiams tai ir nebus revoliucinis pagreitėjimas, tačiau esant didelėms duomenų bazėms ir dideliam vartotojų skaičiui, dešimtosios sekundės dalys pradeda vaidinti svarbų vaidmenį. Taigi, važiuojame:

Patarimas 1. Jei įmanoma, ciklo pakartojimo skaičius turi būti žinomas prieš ciklą, o ne pačiame cikle

Dažnai matomas panašus kodas:

for ($i=0; $i < count($masyvas); $i++) {
  echo $masyvas[$i] . " ";
}

arba

$result = mysql_query("select … from …");
for ($i=0; $i < mysql_num_rows($result); $i++) {
  $row = mysql_fetch_array($result);
  echo $row['id'] . " ";
}

Iš pirmo žvilgsnio - normalus, korektiškas, veikiantis kodas. Tačiau: gal iš pirmo žvilgsnio tai sunku pastebėti, tačiau sukdamas ciklą, PHP interpretatorius turi kiekvieną kartą tikrinti "count($masyvas)" arba "mysql_num_rows($result)". Jei ciklas atliekamas tūkstančius kartų, tai tūkstančius kartų ir bus kviečiamos funkcijos. Argi ne optimaliau padaryti taip:

$count = count($masyvas);
for ($i=0; $i < $count; $i++) {
  echo $masyvas[$i] . " ";
}

Tyrimas: užpildęs 1000 elementų masyvą, įvykdžiau du skriptus: "blogą" variantą ir "gerą" variantą. Rezultatas gavosi pirmuoju atveju 0.0034 sekundės, o antruoju 0.0018 sekundės. Taigi galima daryti išvadą, kad toks nedidelis optimizavimas pagreitina paprastą skriptą dvigubai. Sudėtingesniems skriptas, be abejo, laiko laimėjimas bus ne dvigubas, tačiau čia tikrai galima sutaupyti laiko. Galite pabandyti savo tinklapiuose, ir pasakysite skirtumą.

Patarimas 2. $masyvas[id] ar $masyvas['id']

PHP kalbos sintaksė leidžia naudoti abu nurodytus variantus, ir skriptas veiks. Tačiau, kaip pasirodo, greičio atžvilgiu efektyvumas skiriasi.

Skriptas nr.1:

$array = array();
for ($i=1; $i <= 1000; $i++) {
  $array[] = array("id" => "1″);
}
$count = count($array);
for ($i=0; $i < $count; $i++) {
  echo $array[$i][id] . " ";
}

Rezultatas: 0.0072 sek

Skriptas nr.2

$array = array();
for ($i=1; $i <= 1000; $i++) {
  $array[] = array("id" => "1″);
}
$count = count($array);
for ($i=0; $i < $count; $i++) {
  echo $array[$i]['id'] . " ";
}

Rezultatas: 0.0033 sek

Išvados: šiuo atveju pagreitėjimas daugiau negu dvigubas, nors ir sekundės dalimis nelabai juntamas.

Patarimas 3. Priskirinėkite kintamiesiems pradines reikšmes

Kartais tenka kode matyti tokių atvejų, kai naudojamas sakinys $kintamasis++, nors pats kintamasis dar neapibrėžtas. Vėlgi PHP sintaksė tai leidžia, ir skriptai veiks tvarkingai, tačiau palyginkime, kiek laiko sutaupo tos reikšmės priskyrimas

Skriptas nr.1:

for ($i=1; $i <= 1000; $i++) {
  $a = "a" . $i;
  $$a++;
  echo $a . " ";
}

Rezultatas: 0.0051 sek

Skriptas nr.2:

for ($i=1; $i <= 1000; $i++) {
  $a = "a" . $i;
  $$a = 0;
  $$a++;
  echo $a . " ";
}

Rezultatas: 0.0026 sek

Išvados: Priskirinėti pradines reikšmes kintamiesiems vis tik verta. Nors tai sutaupys ir nedaug, bet kažkiek laimėti galima.

Bendrai šnekant, šie mano patarimai jums sutaupys sąlyginai nedaug laiko, daug daugiau galima sutaupyti užsiėmus pvz duomenų bazės užklausų optimizavimu. Tačiau ir šiuos smulkius patarimus visai pravartu žinoti.



       
Norite gauti Skaitykit.lt naujienas operatyviau? Prenumeruokite RSS įrašus
Jei nežinote, kas yra RSS ir kaip juo naudotis, apie tai galima pasiskaityti šiame puslapyje.

Komentarai

Komentarų: 9 prie straipsnio “Nedidelis PHP skripto pagreitinimas paprastais būdais”

  1. prašytojas
    Vasaris 23rd, 2009 4:48 pm

    geras straipsnis, privertė permastyti :)

  2. Tomas Markauskas
    Vasaris 23rd, 2009 5:50 pm

    Su tokiais optimizavimais daug laimėti neįmanoma, nes didžiausią laiko dalį skriptas vykdys sudėtingesnes operacijas nei čia aprašytas. Pirmas patarimas nors ir nesutaupytų nieko, bet naudingas tuo, kad priverčia kai kuriuos pradedančiuosius mąstyt, ką ir kaip php išvis vykdo.

    Verta paminėti, kad $masyvas[id] yra ne tik lėčiau (nors tai ir nėra svarbu), bet ir netaisyklinga sintaksė, nes ‘id’ be kabučių yra ne string’as, o konstanta, kuri nėra deklaruota (dėl to ir lėčiau), tačiau kodas veikia, nes php standartiškai nedeklaruotas konstantas į stringus verčia.

  3. Tadas
    Vasaris 23rd, 2009 6:18 pm

    o sita vieta apskritai yra beprasme:

    for ($i=1; $i <= 1000; $i++) {
    $a = “a” . $i;
    $$a = 0;
    $$a++;
    echo $a . ” “;
    }

    jei sulig kiekvienu ciklo prasisukimu priskiriam $$a reiksme 0, tai kokia prasme kitoje eiluteje ta reiksme didint?

    Ar tik neturetu $$a=0 buti pries cikla? :)

  4. Timerider
    Vasaris 23rd, 2009 6:38 pm

    Tadai, taigi čia kiekvieną kartą generuojamas naujas kintamasis. $a1, $a2 ir t.t. iki $a1000, būtent tai ir daro ciklas ir viskas čia ok

  5. Tadas
    Vasaris 24th, 2009 10:25 am

    Pritariu, taciau mes as kalbu ne apie $a, o apie $$a, kuris siame cikle neturi visiskai jokios prasmes (mano nuomone).

    Sutrumpinau cikla iki 9 ir ka gaunu?

    Kai $i = 1, tai $a = a1, $$a = 1
    Kai $i = 2, tai $a = a2, $$a = 1
    Kai $i = 3, tai $a = a3, $$a = 1
    Kai $i = 4, tai $a = a4, $$a = 1
    Kai $i = 5, tai $a = a5, $$a = 1
    Kai $i = 6, tai $a = a6, $$a = 1
    Kai $i = 7, tai $a = a7, $$a = 1
    Kai $i = 8, tai $a = a8, $$a = 1
    Kai $i = 9, tai $a = a9, $$a = 1

    Kaip matai $$a visada bus = 1.

    Kodas:

    for ($i=1; $i <= 9; $i++) {
    $a = “a” . $i;
    $$a = 0;
    $$a++;
    echo ‘Kai $i = ‘.$i.’, tai $a = ‘.$a.’, $$a = ‘.$$a;
    echo “”;
    }

    Pataisykit, jei esu neteisus :)

  6. Timerider
    Vasaris 24th, 2009 10:34 am

    Tadai, iš dalies esi teisus, iš dalies ne.
    Visų pirma, ar esi skaitęs apie tokią sintaksę kaip “Variable variable”: http://lt2.php.net/language.variables.variable

    Toliau. Ciklas iki 9 atrodytų realiai taip:

    Kai $i = 1, tai $a = a1, $a1 = 1
    Kai $i = 2, tai $a = a2, $a2 = 1
    Kai $i = 3, tai $a = a3, $a3 = 1
    Kai $i = 4, tai $a = a4, $a4 = 1
    Kai $i = 5, tai $a = a5, $a5 = 1
    Kai $i = 6, tai $a = a6, $a6 = 1
    Kai $i = 7, tai $a = a7, $a7 = 1
    Kai $i = 8, tai $a = a8, $a8 = 1
    Kai $i = 9, tai $a = a9, $a9 = 1

    Būtent tai aš ir norėjau parodyti, kad sukuriu 1000 kintamųjų nuo $a1 iki $a1000, kiekvienam iš jų priskiriu 0, ir padidinu iki 1. T.y. 1000 kintamųjų inicializavimas ir reikšmės pakeitimas, būtent ant to ir susitaupo kažkiek sekundės dalių.

    Emm, tikiuosi pagavai kampą? :)

  7. Tadas
    Vasaris 24th, 2009 10:49 am

    nu va, nebuvau skaites apie tai.
    Ačiū :)
    (dašilo pagaliau man) :)

  8. Dummas
    Kovas 3rd, 2009 8:48 am

    Nelaikas jau butu atsisakyti php?
    python::

    for i in items:
    print i

    Ir viskas. : ))

  9. node
    Rugsėjis 28th, 2009 9:00 pm

    che idomu kas per python =)

Parašykite komentarą





Turinio valdymas: WordPress