Guten Tag meine lieben Mitbürger,
ich schreibe aktuelle an einem neuem CMS und habe mich gerade wieder furchtbar über die
Entwickler des ReCMS aufgeregt. Als ich den HTML-Code des Clientens klauen wollte bin ich
über sehr performante Lösungen gestolpert.
Damit die Leute, die wirklich etwas lernen wollen, etwas lernen können schreibe ich hier mal
ein kleines Tutorial wie man die Geschwindigkeit einiger Seiten sehr einfach optimieren kann.
Anführungszeichen oder Apostroph ?
Etwas was ich fast täglich sehe sind lustig definierte Strings, welche dem Webserver mehr
Arbeit machen als nur benötigt. Besonders schön sieht man das an Deklarationen wie der
Folgenden:
So etwas ist totaler Unsinn. Der Webserver wird versuchen bei der Verarbeitung dieser
Deklaration z.B. Strings in diesem String zu suchen und zu ersetzen. Richtig wäre es hier
mit einem Hochkomma zu arbeiten.
Ein Benchmark zeigt auf meinem PC (MacBook Pro 2011 - getestet in: Coderunner
- 10000 definitionen) doch recht deutliche Differenzen die Zeit betreffend:
Anführungszeichen:
LOWEST: 0.087432861328125 Millisekunden
HIGHEST: 0.094133853912354 Millisekunden
Apostroph:
LOWEST: 0.00098109245300293 Millisekunden
HIGHEST: 0.001060962677002 Millisekunden
Wenn man das mal bei einer gut besuchen Webseite ausprobiert wird die CPU stark entlastet,
was sich auch in der Geschwindigkeit widerspiegelt.
SELECT * FROM schlecht
Jetzt kommen wir zu meinem kleinen "Aufreger" des heutigen Tages:
$client_port = mysql_fetch_assoc($client_port = mysql_query("SELECT * FROM cms_settings WHERE variable = 'client_port'"));
$client_mus = mysql_fetch_assoc($client_mus = mysql_query("SELECT * FROM cms_settings WHERE variable = 'client_mus'"));
$client_ip = mysql_fetch_assoc($client_ip = mysql_query("SELECT * FROM cms_settings WHERE variable = 'client_ip'"));
$client_variables = mysql_fetch_assoc($client_variables = mysql_query("SELECT * FROM cms_settings WHERE variable = 'client_variables'"));
$client_variables_night = mysql_fetch_assoc($client_variables_night = mysql_query("SELECT * FROM cms_settings WHERE variable = 'client_variables_night'"));
$client_texts = mysql_fetch_assoc($client_texts = mysql_query("SELECT * FROM cms_settings WHERE variable = 'client_texts'"));
$client_swf_path = mysql_fetch_assoc($client_swf_path = mysql_query("SELECT * FROM cms_settings WHERE variable = 'client_swf_path'"));
$client_habbo_swf = mysql_fetch_assoc($client_habbo_swf = mysql_query("SELECT * FROM cms_settings WHERE variable = 'client_habbo_swf'"));
$client_limit = mysql_fetch_assoc($client_limit = mysql_query("SELECT * FROM cms_settings WHERE variable = 'cms_clientlimit'"));
Gut. Dieser Code erledigt seine Aufgabe... Aber wusstet ihr dass hier sogar 3 Fehler gemacht
wurden? Nein?
Erstens das Anfürungszeichen. Aber wieso soll man mehrere Querys ausführen obwohl diese 9 Querys
in einen passen? Ich möchte jetzt natürlich nicht am Können von Diwo und/oder MoneyMaker zweifeln,
aber ich kenne eine Methode womit dies bis zu 90% schneller geht:
$startzeit = microtime(false);
$query = mysql_query('SELECT variable, value FROM cms_settings');
while($row = mysql_fetch_array($query)) {
$settings[$row['variable']] = $row['value'];
}
print_r($settings);
echo "Daten geholt in ".(microtime(false) - $startzeit) . " Mikrosekunden";
Ich hole mir die Daten einfach in einem Query. Und das beste ist, dass hier zwar doppelt so viele Daten
geholt werden (18 statt nur 9) aber die Zeit immer noch deutlich niedriger ist: 0.026737 Mikrosekunden.
Die andere Lösung (von Diwo oder MoneyMaker) benötigt dabei 0.141814 Mikrosekunden. Wenn man
dazu rechnet dass dort nur die Hälfte der Daten geholt wurden sieht man dass meine Lösung nur
9% der Zeit benötigt hat. Bei einem Webserver fallen diese Werte natürlich um einiges höher aus,
ihr müsst nun nicht Flamen weil ich hier wegen Millisekunden rum meckere.
Ausserdem sind die Server des Habbo.mn relativ gut optimiert. Wir z.B. haben die komplette
Datenbank in unseren RAM gelesen. Dies verringert die Festplattenzugriffe und ist um einiges
schneller.
Noch mehr Geschwindigkeit erreiche ich in dem Skript oben durch den Array. Dazu aber beim
nächsten Mal mehr.
<!-- Fortsetzung folgt !-->