konstans vs. assz.tömb
Sziasztok, lenne egy kérdésem, adott egy config.php tele mindenféle (lassan már 200 darab) beállítással. Melyik és miért jobb? Konstansokat használjak vagy egy nagy asszociatív tömböt, esetleg több kisebb asszociatív tömböt? Milyen előnyei, hátrányai vannak ezeknek? (azon kívül, hogy ízlés dolga?:-)
■
Asszociatív tömb...
teszt?
Ezt mire alapozod? Egyrészt túl nagy különbség szerintem nem lehet köztük, de ha van is, kérdés hogy egyáltalán mennyire számottevő-e. Ezenkívül (ez csak tipp, nem néztem utána) de egy tömbelem elérése drágább lehet, mint egy konstansé.
Itt szerintem egyéb szempontok alapján lenne érdemesebb dönteni. Pl. a konstansok esetén nem láthatósággal foglalkozni, viszont nem tudod módosítani a tartalmát stb..
Felhő
Teszt szerint...
200 darab konstans közül kiválasztani a x-ediket 0.0004 másodperc, még egy ugyanilyen asszociatív tömbből kiválasztani ugyanazt 0.0002 másodperc.
(Ui. mindez PHP4-ben. PHP4 előtt állítólag* még a tömbelérés sokkal lassabb volt.)
* Nem próbáltam, csak olvastam.
Hogyan tesztelted?
Az én tesztem ezt igazolta is. Jópárszor futtatva mindig minimum 2,5-szer gyorsabb volt a konstans. Az olvasott teszteket nem érdemes készpénznek venni, mert verziórol verzióra történhetnek változások, meg lehetnek eleve hibásak is. Érdemesebb inkább kipróbálni őket. Bár jelen esetben nem sok különbség van.
Felhő
Két külön fájlban...
Define.php:
Kavar a tesztben
Felhő
Nincs összekeverve...
(A 3. hsz-ben helytelenül fogalmaztam, elérés => futásidő. Tehát a teljes megvalósítsára értettem az állítást, nem arra a részfeladatra, amikor már csak az elérés történik.)
arányok
Csak a valós életben elég erősen függ az alkalmazástól, hogy mi a létrehozás és az elérés aránya. Az én keretrendszeremben például egy rakat alap konstanst nagyon sokszor használok (különböző típusú objektumok példányosítása többnyire), egy részüket ritkábban, de általában többször érem el őket, mint ahányszor definiálom őket.
Sorry, de ezt nem tudhattam.
Felhő
Másik teszt
Nos, végül is utánna jártam magam is a dolognak. Készítettem egy szkriptet amiben először 1000 majd 10000 konstans és változó létrehozásának idejét próbáltam összehasonlítani. A szkript valahogy így festett.
A beszúrt függvények semmit nem csináltak, csak kiírták, hogy start..., azért kellettek, hogy az APD-vel lehessen mérni a különbséget. A méréskor az jött ki, hogy semmi különbbség nincs a konstans és a változók használata között, sőt kicsit gyorsabban lehet létrehozni konstanst, mint változót.
Megjegyzendő, hogy a konstansok létrehozásának idejét jól le lehetett olvasni az APD kimenetén, de a változók létrehozásának ideje nem a main sornál jelent meg, hanem az apd_set_pprof_trace függvénynél. Amennyivel nőtt az apd_set_pprof_trace függvény végrehajtási ideje, amennyivel a define-ek ideje, ez valószínűleg bug.
Akkor felmerül a kérdés, hogy mégis miért tesz ki jelentős értéket mérésnél a konstansok létrehozása. A válasz valószínűleg az, hogy a memóriafoglalás költséges művelet. Változók és konstansok létrehozásakor memóriaterületeket kell lefoglalni futásidőben. De most nehogy arra következtessen már valaki, hogy mostantól nem fog változókat, konstansokat használni.
A define-ek végrehajtási ideje a már memóriában lévő dolgokon elvégzett műveletekhez képest lassúak, vagy akkor ha több tucat - 70, 80 db - végrehajtási idejét hasonlítjuk valami más egyszerűbb művelethez.
Az elérési idejüket nem mértem, de valószínűleg egy konstans elérése - ha minimálisan is de - gyorsabb, mint egy tömbelemé. Ellenben a tömbelemeket hatékonyabban lehet használni különböző programszerkezetekben, pl. ciklusban; kiíratásnál, értékadásoknál.
létrehozás tényleg lassabb
De ez mind nem túl számottevő, szóval nem ez alapján érdemes választani.
Felhő
Tesztelőknek
Azon az pár század másodpercen, ami a kettő megoldás közti különbség, tényleg érdemes szerintetek ennyit gondolkodni? :)
-boogie-
persze
Ezt már beláttuk korábban, volt róla szó, de jogos. Enyémet javítottam.
Erre is írtuk, hogy nem, de van akit érdekel, hogy mi van a dolgok mélyén, van akit nem.
Felhő
Másik teszt
Az általad ajánlott módszer szerint:
A mérő szkript: