Archief - PHP: For-lus timings

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

ecko

Legacy Member
Voor het ontwikkelen van een web applicatie moet ik via een for-lus een tabel displayen.
Op mijn ontwikkelPC ging dit ok, maar op een laptop van een collega gaf dit een timeout (30 seconden stuff)

Nu; om na te gaan waar het probleem zich zou kunnen situeren, besloten we een timing test te doen.
Het script:
PHP:
<?php
$aantal = 1500;
$start = time();
$startsec = microtime();
for($i=0; $i<$aantal;$i++) {
	echo "<!-- " . time() . " -- " . microtime() . " -->\n";
}
$totaal = time() - $start;
$totaalsec = microtime() - $startsec;
$totaal = $totaal + $totaalsec;
$perseconde = $aantal / $totaal;
echo "Aantal seconden voor <b>$aantal</b> iteraties: <b>" . $totaal . "</b><br />\n";
echo " &nbsp; &nbsp; ==> <b>" . $perseconde . "</b> iteraties per seconde";
?>
Natuurlijk zegt nu iedereen: dit zal bij jou sneller gaan dan bij je collega. Niet dus!
Mijn collega krijgt ongeveer 110-130 iteraties per seconde, ik krijg een 55-65 iteraties per seconde. Hij gaat dus 2x zo snel! Het werd getest bij andere gebruikers en er zijn vergelijkbare resultaten vastgesteld.
Laptops: ~120 per seconde
desktops: ~60 per seconde
-beiden IE, FF geeft 140/s op een van de laptops-
Desktop: 2,8Ghz P4 512MB ram
Laptops: 1.7Ghz PMobile met 1024MB ram EN!!! een oud model (denk PIII of oude PIV) met 256MB ram

Mocht het enkel de laptop met 1024MB ram zijn, ok, maar die oude geeft dus ook die timings (zelfs nog beter dan die met 1024MB ram)

Het script wordt telkens vanop dezelfde server gedraaid, dus daar kan het imho niet echt aan liggen. We zitten op hetzelfde netwerk bovendien.
Kunnen jullie eens testen aub? (Gelieve ook specs te posten)

killgore

Legacy Member
ge berekent uw microtime verkeerd.

stel da gij op 0.999 seconden begint en ge stopt op 1.001 seconden, is dus 2 miliseconden, in uw berekening -> .998 miliseconden.

ook is microtime() 2 waarden (een string eigenlijk), niet 1, en aftrekken gaat dus niet zomaar.

En dat kan veel verklaringen hebben hoor. Bv. een desktop zal zo goed als nooit in energiebesparing staan (als het om windows gaat) en dus alles laten draaien terwijl een laptop zoveel mogelijk dat niet gebruikt wordt afzet en dus "meer" cpu power heeft. Het kan ook aan php versie liggen of (zoals hiervoor gesteld) aan verkeerde berekeningen.

edit: ook is iets als een echo vrij onrepresentatief, het is iets vrij extreem snel :).
120 per seconde is al bij al extreeeeeeeeeeeeeeeeeeeeeeeem traag dus uw results kloppen niet (met aangepaste test kom ik hier iets van 20k-60k per seconde uit, wat al veel correcter is)

edit2: 't is ook iets da geen echte constante levert aangezien er constant naar de outputbuffer moet geschreven worden, wat bij mijn weten geen constante complexiteit heeft. Als ik test met 15000 loops (groter getal en veel representatiever dan 1500) kom ik rond de 26K/seconde uit, 25000 loops is dan 19K/sec, 50000 loops levert iets van 15K/seconde en 150000 loopt vast (kgok wegens overvolle outputbuffer).

edit3: Met flushen krijg ik al meer gelijkaardige resultaten tijdsgemiddeld (gaat nog steeds omlaag tijdsgemiddeld met lus, maar dit blijft logisch omdat output zich blijft opstapelen, nu echter niet in OB).
mijn code (let op, php5!!!):

PHP:
<?php
$aantal = 15000;
$startsec = microtime(true);
echo $startsec."<br />";
for($i=0; $i<$aantal;$i++) {
    echo "<!-- " . time() . " -- " . microtime() . " -->\n";
}
echo ($eindsec=microtime(true))."<br />";
$totaalsec = $eindsec - $startsec;
$perseconde = $aantal / $totaalsec;
echo "Aantal iteraties per seconde voor <b>$aantal</b> iteraties:<br />\n";
echo " &nbsp; &nbsp; ==> <b>" . $perseconde . "</b> iteraties per seconde";
?>

ecko

Legacy Member
Als ik boven de 2000 ga, krijg ik timeout. Niets te maken dus met het te kleine aantal, ik KAN niet hoger gaan.
De server is een VMWare, draait op quad weetikveelwat.
Trust me, omgeving zou het niet mogen zijn, maar ik ga het zeker eens nagaan.

Het is wel PHP5 op IIS, ga nu eens testen met Apache. Ik zou eerder daar het "probleem" zoeken.

killgore

Legacy Member
ecko zei:
Als ik boven de 2000 ga, krijg ik timeout. Niets te maken dus met het te kleine aantal, ik KAN niet hoger gaan.
De server is een VMWare, draait op quad weetikveelwat.
Trust me, omgeving zou het niet mogen zijn, maar ik ga het zeker eens nagaan.

Het is wel PHP5 op IIS, ga nu eens testen met Apache. Ik zou eerder daar het "probleem" zoeken.
Het kan aan IIS liggen, maar dat zou me sterk verbazen en zou veel eerder aan slechte config liggen. Ik heb hier lange tijd met IIS gewerkt en dan naar apache overgeschakeld voor enkele specifieke zaken die ik ook op server had, maar zware fouten in benchmarks heb ik nooit gehad.

En dat aantal is wel degelijk veel te klein, 120 van die kleine echotjes en 2 time-call functies per seconde is veel te traag, daar zit iets grondig fout.
Mijn desktop is 2.6 ghz trouwens ;).

ecko

Legacy Member
Apache: 30 000 per seconde.
Duidelijk een IIS configuratieprobleem of een IIS probleem tout court.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan