phpbar.de logo

Mailinglisten-Archive

[php] Methode lieber statisch oder nicht

[php] Methode lieber statisch oder nicht

Yannik Hampe yannik at cipher-code.de
Fre Sep 14 17:53:36 CEST 2007



Steffen Kother wrote:
> Hi ihr,
> 
> Yannik Hampe wrote:
>> Dann kommt noch dazu, dass pdo ein paar tolle Performancesteigerungen 
>> hat. Wie zum Beispiel foreach($statement as $row). Das ist zwar nur
>> gerinfühgig schneller als die while-Lösung von mysql_fetch_*,
>> aber wenn man sich nur genug Zeilen aus der DB holt fällt es schon ins
> Gewicht.
> 
> Wobei ich da ein Verständninsproblem habe. Wie müsste ich die Zeit für
> einen korrekten Vergleich PDO vs. MySQL ermitteln?
> 
> Variante A:
> ===========
> $pdoso = pdo -> query('SELECT * FROM something');
> $pdoso -> setFetchMode(PDO::FETCH_ASSOC);$query = mysql_query('SELECT *
> FROM something');
> 
> for ($i = 0; $i < 10000; $i++) {
> 	// PDO
> 	foreach ($pdoso as $row) {
> 		// Eine Zeile aus dem ganzen Ergebnis nehmen
> 	}
> 
> 	// MySQL
> 	while($record = mysql_fetch_assoc(§query) {
> 		// Ergebnis an der Resource abholen
> 	}
> }

Die for-Shleife ist relativ sinnlos, denn der Query wird ausserhalb der 
for-Schleife einmal ausgeführt und dann rattern pdo und mysql einmal 
alle Zeilen durch und alle weiteren Schleifendurchläufe machen garnicht 
mehr, da beriets alle Zeilen geholt worden sin...
> 
> Variante B:
> ===========
> for ($i = 0; $i < 10000; $i++) {
> 	// PDO
> 	foreach (pdo -> query('SELECT * FROM something') as $row) {
> 		// Eine Zeile an der Resource abholen
> 	}
> 
> 	// MySQL unverändert
> }

Jetzt führst du PDO 10K mal aus aber mysql weiterhin nur einmal?
> 
> Bei Variante A liegt PDO vor mysql_fetch_assoc() und PDOs fetchAll().
> Ich habe dazu einfach mal 10000 Loops über unseren Teilestamm (ca. 8500
> Sätze) gemacht und mir die Zeiten anzeigen lassen. Variante B ist
> natürlich zu gunsten mysql_fetch_assoc() ausgefallen.

Alles Andere hätte mich jetzt auch gewundert ;-).
Um PDO und MySQL zu vergeleichen musst du dir erstmal überlegen, worum 
es dir geht. Wenn du wissen willst, wieviel schneller pdo's prepared 
statements im Vergleich zu mehrmals ausgeführten mysql_*-Statments sind 
müsstest du das so machen

$start =microtime(true);
$stmt =$pdo->prepare('SELECT * FROM tab WHERE rand=?');
for($i=0; $i<10000; ++$i)
{
   $stmt->execute(array(mt_rand()));
   $stmt->setFetchMode(PDO::FETCH_NUM);
   foreach($stmt as $row) ...
}
echo 'PDO brauchte: ',microtime(true)-$start,' Sekunden';


$start =microtime(true);
for($i=0; $i<10000; ++$i)
{
   $result =mysql_query('SELECT * FROM tab WHERE rand='.mt_rand());
   while($row =mysql_fetch_row($result)) ...
}
echo 'mysql_ brauchte: ',microtime(true)-$start,' Sekunden';
Das ganze kannst du natürlich scherzeshalber mit NUM und mit ASSOC mal 
machen. Das mt_rand() ist dafür da, damit der mysql-query-cache dein 
Ergebnis möglichst wenig verfälscht.

Wenn du hingegen wissen möchtest, ob pdo oder mysql_ schneller ist, wenn 
du immer einen komplette anderen Query ausführst, dann musst du im 
pdo-Teil den prepare-Aufruf einfach noch mit in die for-Schleife legen.
> 
> Ein schönes WE euch allen.

Yannik

php::bar PHP Wiki   -   Listenarchive