MikoAndras.hu

Mikó András

Kód-optimalizálás php-ban

Kód v3 – új alapok

A dinamikus programozási megközelítéssel nagyon sokat nyertünk, a további finomítás ezért kevésbé látványos eredményeket ad majd. Ennek ellenére érdemes továbbmenni, mert ha ez egy éles rendszeren futó kód lenne, minden µs gyorsítás számíthat.

Az első elemzések kapcsán előkerült, hogy a futásidő hatványozottan emelkedik. Ennek a foreach ciklus az oka, mivel ez nem meghatározott számú alkalommal, hanem hatványozottan többször és többször fut le, mivel minden egyes újabb vendéggel hatványozottan emelkedik a lehetséges variációk száma is.

Támadott kódrészlet

          $actual_variation = explode(',', $variation);
          $actual_variation[] = $rn;
          sort($actual_variation);
          $actual_variation = implode(',', $actual_variation);

Mivel a tömb nem egyszerű típus, ezért az ezen végzett műveletek drága műveletnek számítanak. Ebből pedig mindjárt hármat használunk is a ciklusban: explode, sort, implode. Ezektől kellene mihamarabb megszabadulni.

A variációkat szövegként tároljuk el, mivel ezeket könnyen tudjuk az in_array() segítségével hasonlítani, ezért kézenfekvő lenne, ha eleve ezeken a szöveges változatokon végeznénk a variációszámításokat. Ez megoldhatóvá válik, amennyiben a tömb-sorbarendezés helyett eleve rendezett variációkat hozunk létre minden lépésben.

Egy variáció-string (30 főre):

          $actual_variation = "1,1,1,1,2,2,3,3,4,4,4,4";

Kiváltó kód

Négy esetet kell vizsgálni, hogy miként adjunk hozzá egy szobaértéket a variációlistához. Először elméletben, majd ezt megvalósítani kódban.

1 fős szoba

Egyszerűen feltesszük a sor elejére, mert ennél kisebb szobaérték nincs.

4 fős szoba

Egyszerűen feltesszük a sor végére, mert ennél nagyobb szobaérték nincs.

2 és 3 fős szoba

Be kell illeszteni a sorba az ugyanolyan értékek, vagy ha ilyen nincs, akkor a legnagyobb nála kisebb érték mögé.

Ugyanez kódnyelven:

            if ($rn == 1) {
              $actual_variation = $rn . "," . $variation;
            } else if ($rn == 4) {
              $actual_variation = $variation . "," . $rn;
            } else {
              for ($lrn = $rn; $lrn > 0; $lrn -= 1) {
                $pos = strrpos($variation, (string)$lrn);
                if ($pos !== false) {
                  $actual_variation = substr($variation, 0, $pos + 1) . "," . $rn .
                      substr($variation, $pos + 1, strlen($variation));
                  break;
                }
              }
            }

A verzió erőforráshasználata:

Számítási idő v3

Számítási idő v3

Memóriahasználat v3

Memóriahasználat v3

Szöveges értelmezésben:

  • 1 másodpercen belül kiszámítható: 47 fő
  • 30 másodpercen belül kiszámítható: 79 fő
  • 25 fő érkező vendég kiszámítása: 0.0312 másodperc
  • 128MB memórialimit elérése: még mindig nagyon messze

Értékelés: egyre jobb.

Az eddigi változtatások még mindig követhető “öndokumentáló” kódként kerültek kialakításra, viszont vannak olyan módszerek, amik alkalmazásakor ezt a szépséget kell beáldozni a további teljesítménynövekedésért cserébe.

Irány a kódzagyválás…

Pages: 1 2 3 4 5 6 7

, , ,

Comments are currently closed.