ugrás a tartalomhoz

Page Load Time

alkony4 · 2016. Feb. 14. (V), 02.15
Szervusztok!

Azon problémával fordulok hozzátok, hogy egy korábbi problémám kapcsán (lassú oldal betöltés) kerestem egy egyszerű kis php scriptet ami megmondja az oldal betöltési idejét íme:
<?php
$start = microtime(true);
$y = 0;
for($x=0;$x<=1000000;$x++)
	{
	$y = $x;
	$y *= pi();
	$y *= (pi() * 2);
	}
$end = number_format((microtime(true) - $start), 2);
echo $end;
?>
Az alábbi kód, ami példavideóban is igen kicsi volt nálam jelentős időt vesz igénybe hogy lefusson, közel 1 másodperces lefutási időt.
Gondolom nem olyan szép dolog ez a 1 millás ciklus, viszont ennek ellenére is ennek szépen gyorsan le kellene futnia, főleg ha volt rá példa is.
Mitől lehet ez? A gép teljesítménye szerintem kilőve mert 8gb-ram nem leterhelve proci is egy 4 magos amd phenom 2.2 ghz-n (4 mag) átlag 5-7%os kihasználtsággal (php script lefuttatásakor 20-50%). Tehát nem meríti ki a gép teljes igényét viszont még is látványosan meghúzza a procit az a kis egyszerű kód.

Ölteitek, segítségetek előre is köszönöm.

Szerkesztve:
Megnéztem egy külső webszerveren, ott 4 másodpercet vett igénybe a kód lefutása. Létezik hogy, egyes kódok (ha egy millaszor kell nekik lefutni) ilyen irdatlan mértékben lassan fussanak le?
Orvoslatként mit tehet az ember? Főleg ha egyes ehhez hasonló kódokat többször is más más felhasználók futtatnának? Atomerőmű vásárlása?
Köszönöm.
 
1

PHP

Hidvégi Gábor · 2016. Feb. 14. (V), 09.28
A PHP-nak lassú a változókezelése, több okból is, például a változóknak van egy bizonyos overhead-je.

A pi() függvényt ciklusonként kétszer futtatod.

Ha például a pi() értékét kiteszed egy-egy változóba, (nálam legalábbis) 40% gyorsulást lehet elérni:
$pi = pi();
$ketpi = $pi * 2;
for($x=0;$x<=1000000;$x++)
{
$y = $x;
$y *= $pi;
$y *= $ketpi;
}


PHP7 alatt egyébként a fenti fele annyi idő alatt lefut, mint 5.6-ban.
2

Nagyon szépen köszönöm

alkony4 · 2016. Feb. 14. (V), 10.48
Nagyon szépen köszönöm válaszod!

Még annyi érdekelne, hogy ugyan ez a kód csak azért kellett, hogy egy másik hibámat tudjam csekkolni vele, sebességoptimalizálási szempontból mit érdemesebb használni? Arrayeket vagy sima változókat? Életemben először futottam bele, hogy 'hibátlanul' írók kódot csak épp nem optimálisan (vagy legalább is eddig nem okozott gondot x).

Ha egy kicsit bővebben szeretnék írni róla akkor:
Van egy adatlap, benne sok sok objektum töltődik be, mindegyiknek van menüje jobb klikk esetén, illetve ha ráviszik az egeret akkor egy kis bubi tartalommal.
Ezt az oldal betöltéskor mind mind betöltődik... különböző vizsgálatok futnak le hogy mikor mit kell betöltsön a menürészébe és a buborékjába. Kiszűrni úgy gondoltam, hogy amikor lenyomom a jobb klikket töltődik be a tartalom, vagy amikor az egér az objektum felé ér akkor töltődik be a buborék tartalma. Egyenlőre viszont száraz teszt gyanánt kilőttem totál a menü és a bubi betöltést... Látványosan ugrott a sebesség de még nem kellően, az objektumok önmagukban is elég sok ellenőrzésen esnek át amikor betöltődnek, jó pár sql lekérdezéssel. Ott bizonyos paramétereket tömbbe töltöttem nem pedig sima változóba. Előfordulhat hogy egy tömb kevésbé optimális ilyen esetekben?

Köszönöm.
3

Sajnos konkrétumok nélkül

Hidvégi Gábor · 2016. Feb. 14. (V), 11.32
Sajnos konkrétumok nélkül nehéz bármit is mondani. Mérni kell az egyes blokkok betöltésének sebességét, és meg kell nézni, mi az, ami lassú, és utána lehet gondolkodni az optimalizáláson.

Mennyi idő alatt töltődik be az oldalad? Az sql tábláid indexelve vannak rendesen?
4

xdebug

solkprog · 2016. Feb. 14. (V), 11.41
Mielőtt elmenni a topic abba az irányba hogy "sima változók" vs "tömb változok" az optimálisak a php-ban: tegyél fel egy xdebug-ot (szigorúan csak fejlesztői környezetben) és a profile-al nézd meg a kódod.