MikoAndras.hu

Mikó András személyes oldalai

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

Kód v4 – fordított tömbkezelés

Az előbbi nekifutásban is a tömbkezelő függvényeknek ugrottunk neki, mivel ezeket tartottuk drágának, most sem lesz ez másképp. Viszont az itt bemutatott módosításhoz egy pár dolgot érdemes tisztázni:

  • a variációkat tartalmazó tömbökben szöveges adatokat tárolunk
  • ezeket hasonlítjuk össze in_array() függvénnyel
  • ezek a szöveges adatok tömbönként egyediek (mindegyik csak egyszer fordul elő)
  • nem kell tudnunk sem az értékét, sem a helyzetét az egyező variációnak, csak azt, hogy van ilyen vagy nincs
  • a php alkalmazott verziója képes asszociatív tömbök kezelésére

Támadott kódrészlet

          if (! in_array($actual_variation, $variation_cache[$passengers])) {
            $variation_cache[$passengers][] = $actual_variation;
          }

Az in_array() működése során elindul a tömb elején, és sorra veszi az elemeket, majd elvégzi az összehasonlítást. Csak akkor nem megy végig a teljes tömbön, ha talál hamarabb egyezést, ekkor ugyanis igaz értékkel visszatér. Ha nincs egyező elem, akkor azonban végigellenőrzi a teljes tömböt, és csak ezután tér vissza hamis értékkel.

A fent említett feltételek megléte esetén azonban lehetőségünk van a tömb indexelésére, hogy ezzel is segítsük az összehasonlítást. Ehhez az asszociatív tömbfelépítést használjuk, ugyanis ennek a kulcsait indexeli a php.

Kiváltó kód

          if (! isset($variation_cache[$passengers][$actual_variation])) {
            $variation_cache[$passengers][$actual_variation] = $actual_variation;
          }

A módosítás tényleg csak annyi, hogy nem egy újabb automatikusan számozott bejegyzést teszünk a tömbbe, hanem az aktuális változat string-jét kulcsként használva mentjük el a kombinációt. Majd vizsgálatkor azt nézzük meg, hogy a megadott kulcs létezik-e már, ez pedig az indexelés miatt egy gyorsabb ellenőrzést tesz lehetővé.

A verzió erőforráshasználata:

Számítási idő v4

Számítási idő v4

Memóriahasználat v4

Memóriahasználat v4

Szöveges értelmezésben:

  • 1 másodpercen belül kiszámítható: 92 fő
  • 30 másodpercen belül kiszámítható: ? fő (megáll memórialimit miatt)
  • 25 fő érkező vendég kiszámítása: 0.005 másodperc
  • 128MB memórialimit elérése: 121 vendég számításánál

Értékelés: igazán szemrevaló.

Ez egy olyan pont, amikor már ránézéssel, olvasgatással nem igazán tudunk újabb fogást találni a kódon, hiszen minden részéből faragtunk már. Ilyen pillanatokban jönnek jól a profil-készítő eszközök.

A következő pontok esetében én az XDebug + KCachegrind párost hívtam segítségül.

Pages: 1 2 3 4 5 6 7

, , ,

Comments are currently closed.