17. April 2012 | Leave a comment Hallo zusammen! Im heutigen Beitrag möchte ich kurz ein paar Sätze über die performance von Schleifen und euren Frontends schreiben. Beide hängen in der Regel nämlich voneinander ab und können schnell zu wahren performance-fressern ausarten! Performance von Schleifen Ich möchte kurz mit den Schleifen beginnen, denn da gibt es diverse Tricks mit denen wir arbeiten können – Ich möchte mit einem einfachen Beispiel anfangen: Wir gehen davon aus das unsere Variable „$grosses_array„, wie der Name schon sagt, ein großes Array mit etwa 1000 Elementen ist. // Ein negativ Beispiel für eine FOR-Schleife for ($i = 0; $i < count($grosses_array); $i ++) { // Weitere Logik... } Folgender Fehler kostet uns Wertvolle performance: Die count() Funktion wird innerhalb der Schleifenprüfung aufgerufen - Das hat zur Folge, dass für jede Prüfung (und davon haben wir immerhin 1000 Stück) die Funktion ausgeführt wird. // Das verbesserte negativ Beispiel. $temp = count($grosses_array); for ($i = 0; $i < $temp; $i ++) { // Weitere Logik... } Im zweiten Beispiel haben wir die count() Funktion vor der Schleife ausgeführt - Hier wird sie nur ein einziges Mal aufgerufen. Der performance-Gewinn ist enorm! Je nach Logik innerhalb der Schleife (ggf. existiert in der Schleife ja eine weitere Schleife?) kann die Geschwindigkeit des Skripts um einige hundert Prozent erhöht werden! Die Benchmarks auf phpbench.com liefern euch zwar konkrete Zahlen - Allerdings solltet ihr beachten das ein reiner "Benchmark" nur wenig mit Situationen aus dem echten Leben gemein hat. Die Webseite phpbench.com sollte sich jeder Web-Entwickler ruhig genauer ansehen. Dort gibt noch einige mehr Benchmarks zu Schleifen, Array-Operationen und String-Verkettungen (wobei ich sagen muss das ich bei eigenen Benchmarks andere Werte erhalten habe). Ein weiterer einfacher Trick besteht darin den Content, bzw. die Information die ihr pro Request darstellt, zu beschneiden. Auf diesem Blog werden Beispielsweise auf der Übersichts-Seite nur 10 Beiträge dargestellt, und diese werden sogar noch abgeschnitten und werden erst beim Klick auf "Weiterlesen" komplett geladen! Damit begeben wir uns in Richtung Content! Wo könnten wir überall durch große Arrays iterieren? Schauen wir uns mal die großen wie Google, Twitter, Tumblr und Facebook an. Hier werden riesige Listen mit 'zig Beziehungen zu anderen Diensten benutzt um Content darzustellen - Dennoch sind die Dienste, trotz Millionen von Nutzern und weltweiten Zugriffen, quasi in Echtzeit verfügbar. Von den Datenzentren und Technologien im Hintergrund abgesehen bekommen wir, die Benutzer, immer das gleiche zugeschickt: HTML und einige Grafiken so wie CSS und Javascript. Im Endeffekt kochen eben alle nur mit Wasser 😉 Aber da steckt natürlich ein kleiner feiner Trick hinter - Es wird stets nur geladen was auch auf einen Blick zu sehen ist, Stichwort Ajax. Tweets oder Status-Nachrichten von vor einem Tag werden uns in der Regel nicht beim laden der Seite dargestellt, dafür müssen wir (mehr oder weniger lange) scrollen bzw. nachladen lassen. Um das Thema abzurunden möchte ich auf folgendes hinaus: Wenn ihr eine Web-Applikation baut ist die performance (neben Sicherheit und Barrierefreiheit usw.) mit das wichtigste! Die meisten Daten lassen sich dabei problemlos nachladen ohne das der Nutzer viel davon mitbekommt oder das es ihn stört! Somit müsst ihr pro Request nicht durch hunderte oder tausende Array-Elemente iterieren, sondern könnt durch intelligentes auslagern eine schnelle Applikation aufbauen die durch kleine Tricks große Ladezeiten umgeht! Zu diesen Zweck gibt es natürlich einige vorgefertigte Plugins für die gängigen Javascript Frameworks wie jQuery oder Prototype, denn das nachladen wird generisch vom Benutzer ausgelöst (meist durch scrollen). Solche Plugins findet ihr schnell bei Google über die Stichworte "endless scrolling". Leider ist damit für Heute auch schon Schluss, denn ich werkel grade Nebenbei an einem neuen Projekt das ich auch demnächst hier vorstellen möchte. In diesem Sinne wünsche ich euch viel Erfolg für eure eigenen Projekte und freue mich wie immer über Rückmeldung zum Thema!