Performance von Google+

Wenn man sich den Quellcode von Google+ zu Gemüte führt, wird man schnell feststellen, dass Google wohl wirklich alles getan hat, um auch die letzte Millisekunde Ladezeit rauszuquetschen.

Statisches HTML in Google+ (Bild: @mademyday)

Google+ enthält wohl kein einziges statisch angelegtes Template – alles wird dynamisch generiert. Anders ist dieser Code nicht zu erklären.

Wirft man einen Blick auf das, was neben dem oben gezeigten Code sonst noch so von Google ausgeliefert wird, hat das nicht mehr viel mit HTML zu tun: es wird ein riesiges JavaScript-Objekt initialisiert, indem alle relevanten Daten abgelegt werden: eigene Profilinformationen, Kreise, Stream-Inhalte, etc.

Die Entschlüsselung dieses Objekts ist nicht ganz trivial, weil Google nicht viel Wert auf Lesbarkeit für außenstehende gelegt hat. Wen es interessiert, der kann sich diese beiden Bilder ansehen, wo ich versucht habe, zumindest einige Dinge zu identifizieren:

Herkömmliche JS-Minifier lassen ja normalerweise ihre Finger von Objekteigenschaften und schreiben diese nicht um, Google scheint hier einen drastischeren Weg gegangen zu sein und hat auch die Objekteigenschaften und -methoden einbezogen. Der ganze Entwicklungsprozess scheint so angelegt zu sein, dass man nachher mit relativ wenig Aufwand eine enorm komprimierte Anwendung live schalten kann. Ähnlich wie bei den Chrome-Updates hat Google offenbar auch hier ein Format für Daten gefunden, das extrem flexibel und dennoch platzsparend ist. Da im Gegensatz zu Twitter diese Schnittstellen nicht zur Nutzung durch Drittentwickler gedacht sind, macht das auch nichts aus.

Außerdem arbeitet Google auch hier wieder mit massivem Prefetching, was sich zum Beispiel darin äußert, dass beim Editieren des eigenen Profils kein einziger Request abgesetzt wird, sondern alle Logik bereits geladen ist (außer beim Bild- und Video-Upload).

Letztendlich kombiniert Google extreme Komprimierungstechniken mit cleveren Prefetching-Mechanismen und vor allem sehr viel Server-Power und guter Anbindung, was der Performance des Social Networks sehr gut tut.

 

DWDL-Relaunch

Wie bei so ziemlich jedem Relaunch musste natürlich auch bei DWDL erst einmal alles schief gehen. Nachdem der Relaunch irgendwann in der Nacht abgeschlossen war, lief die Seite zunächst zumindest ohne Probleme. Aus den Tweets zum Thema lese ich, dass dann um etwa 9 Uhr gestern Morgen der Stecker gezogen wurde – aus zunächst nicht näher ausgeführten Gründen. Das komplette Angebot war komplett offline, d.h. es lief noch nicht einmal ein Webserver. Irgendwann gegen Abend lief dann wenigstens die Baustellenseite wieder.

Was ist schief gelaufen? Da die Seite zunächst zumindest nachts problemlos lief und dann später von “Severproblemen” gesprochen wurde, kann das Problem nicht ganz trivial gewesen sein. Ich tippe darauf, dass das Redaktionssystem dem stärker werdenden Besucheraufkommen am Morgen nicht mehr gewachsen war und die Serverlast unnatürlich stark angestiegen ist, was dann zum Ziehen der Notbremse geführt hat. Im Laufe des Tages wurden dann wahrscheinlich in aller Eile Caches gebastelt um die Performanceprobleme in den Griff zu bekommen.

So, jetzt hätte ich mit diesem Absatz voller Spekulation und ohne offizielle Bestätigung wohl gegen alle zehn Leitlinien der DWDL-Redaktion verstoßen.

Inzwischen läuft auf jeden Fall alles, was mir die Gelegenheit gibt, einige kleine Anmerkungen zur Seite an sich zu machen.

Newsticker

DWDL-Newsticker

Zwei Dinge dazu: Die einzelnen Listenelemente könnten einen Tick mehr Abstand haben und die Schriftfarbe könnte auch etwas dunkler sein um für einen besseren Kontrast zu sorgen.

Des Weiteren ist mir aufgefallen, dass die einzelnen Tabs der Box bei jedem Klick durch einen asynchronen Request neu vom Server geladen werden. Das führt zu einer kleinen Verzögerung, wenn man zwischen den Tabs hin und her wechselt. Da könnte man noch einen kleinen Client-Cache basteln, der bei jedem weiteren Klick auf einen bereits geladenen Tab den Request zum Server spart.

Rubrikenfilter

Rubrikenfilter

Es wäre schön, wenn der Filter auch per Tastatur bedienbar wäre. Außerdem wäre für Mausbenutzer ein cursor: pointer; für den Absendebutton wünschenswert.

Zeilenabstand & Typographie

Wie bereits in den Kommentaren zum Relaunch-Artikel von einem User empfohlen, würde auch ich einen etwas größeren Zeilenabstand in den Artikeln bevorzugen. Das würde die Lesbarkeit der Artikel erhöhen. Ich bin zwar kein Experte für Typographie, allerdings glaube ich, dass sich auch eine Schriftart mit Serifen nicht schlecht machen würde.

Performance

Wie so ziemlich jede Magazin-Seite krankt auch DWDL an fehlender Frontend-Performance-Optimierung. So kommt zum Beispiel die Startseite auf über 120 Requests. Da könnte schon einiges durch Zusammenlegen von JavaScript- und CSS-Dateien, sowie GZIP-Komprimierung erreichen.

Fazit

Alles in allem macht die neue Seite einen guten Eindruck. Die Lesbarkeit der Artikel wurde verbessert und die neue “Zahlenzentrale” liefert alles Wichtige auf einen Blick. Inhaltlich ist DWDL ja sowieso meistens hochwertig.

Eine Chance ohne h.264

Google hat heute angekündigt, den Support für h.264 beim <video>-Element in einer der kommenden Chrome-Versionen zu entfernen.

To that end, we are changing Chrome’s HTML5 support to make it consistent with the codecs already supported by the open Chromium project. Specifically, we are supporting the WebM (VP8) and Theora video codecs, and will consider adding support for other high-quality open codecs in the future.

Mit diesem Schritt sorgt man nicht nur für eine Vorentscheidung im Codec War, sondern übt auch einen gewissen Druck auf Apple und Microsoft aus, endlich auf den WebM-Zug aufzuspringen. Zwar ist die Hürde zur Nutzung von WebM im IE9 eher gering (“bitte installieren Sie folgenden Codec ganz schnell und einfach” auf einer vertrauenswürdigen Seite wie Youtube wirkt da Wunder), das Problem bleiben aber die älteren IEs und eben Apple. Auf dem Desktop-Markt scheint also auch in Zukunft erst einmal kein Weg an einem Flash-Fallback vorbeizugehen.

Anders sieht das meiner Meinung nach auf dem Mobilmarkt aus. Zwar existieren momentan noch sehr wenige (wenn überhaupt) Endgeräte mit hardwarebeschleunigtem WebM, allerdings wird der Codec mit wachsender Nachfrage auch interessanter für die Hersteller. WebM ist OpenSource und es fallen keine Lizenzgebühren an. Auch vor Patentklagen sind die implementierenden Hersteller durch den großen und reichen Airbag Google weitesgehend geschützt.

Bleibt zu hoffen, dass sich Samsung und Co. jetzt auch wirklich bewegen und entsprechende Geräte entwickeln. WebM hat auf Mobilgeräten mehr Zukunft als Flash es je hatte.

Google Preview Prefetching

Vor einigen Tagen hat Google ein neues Feature für alle User ausgerollt: Instant Previews. Google zeigt nun auf Wunsch zu jedem Suchergebnis ein Vorschaubild der Seite an und markiert sogar die Position des Teasertextes.

Google Instant Preview

Wie man es von Google gewohnt ist, wurde auch hier das letzte Quäntchen Performance herausgeholt. Bekommt man beim ersten Klick auf die Lupe bzw. auf den Teasertext noch für einen kurzen Moment ein Nachlade-Icon zu sehen, so ist dieses bei jedem weiteren Suchergebnis dieser Seite nicht mehr der Fall.

Dafür ist eine interessante Prefetching-Technik verantwortlich, die mit dem Laden des ersten Vorschaubildes angestoßen wird. In Firebug sieht das dann etwa so aus:

Analyse des Prefetching-Verhaltens mit Hilfe von Firebug

Es wird für jedes Suchergebnis ein eigener Request abgesetzt und Daten über JSONP nachgeladen.

Nachgeladene Daten bei Aufruf eines Vorschaubildes

Nachgeladene Daten bei Aufruf eines Vorschaubildes

Wie man sieht, wird das Vorschaubild base64-kodiert im selben Request mitgeliefert, was in Browsern, die diese Technik beherrschen einen HTTP-Request pro Suchergebnis spart. Zusätzlich werden noch zusätzlich einzublendende Informationen mitgeliefert, die zum Beispiel das Hervorheben des Teasertextes steuern.

Nun stellt sich die Frage, warum Google für jedes Bild einen eigenen Request absetzt. Die Antwort ist eigentlich denkbar einfach: man geht davon aus, dass der User die Vorschaubilder von oben nach unten ansieht. Das heißt, dass das nächste Bild relativ schnell verfügbar sein sollte und keine langen Verzögerungen vorhanden sein sollten. Gleiches Prinzip wie bei #newtwitter. Natürlich wäre eine Bündelung in einen Request absolut gesehen schneller. Jedoch könnte das bei langsamen Verbindungen nach hinten losgehen und zu einer einmaligen, größeren Verzögerung kommen – ein K.O.-Kriterium im modernen Web.

Warum das neue Twitter so schnell ist

Diejenigen, die bereits in den Genuss von #newtwitter kommen, werden es bereits gemerkt haben: es fühlt sich merklich schneller an als die alte Version. Das liegt nicht nur daran, dass man im Hintergrund die Hardware aufgestockt hat, sondern vielmehr an konsequenter Frontend-Optimierung.

Schaut man sich die Applikation in Firebug einmal genauer an, fällt sofort auf, dass jetzt auch das Webinterface die Twitter-API nutzt. Das hat den Vorteil, dass sämtliche Weiterentwicklungen nur noch an einer Stelle geschehen müssen und nicht wie vorher doppelt (für das Webinterface und die API getrennt). Es ist davon auszugehen, dass der Code für die Schnittstelle allgemein performanter ist, da dort ja bereits vorher eine wesentlich größere Last bewältigt werden musste als über das Webinterface. Durch die Umstellung auf die API profitiert die Website an sich bereits ohne weitere Arbeiten. Besonders deutlich sieht man den Unterschied, wenn man sich mal die “Retweet”-Sektion anschaut. Während dieses Feature vorher unerträglich langsam war, ist es jetzt genauso schnell wie die persönliche Timeline oder eine Suche.

Ein weiterer Grund für den Performance-Schub ist auch zweifelsohne der Einsatz einfachster Frontend-Optimierungen (GZIP, Request-Minimierung, JS/CSS-Minifying). Beim alten Web-Client war davon noch kaum etwas zu sehen.

Der wichtigste Fortschritt ist jedoch das konsequent und exzessiv umgesetzte Client-Caching. Was einmal übertragen wurde wird auf der Seite des Users gespeichert und braucht nicht wieder vom Server geholt zu werden. Schön sieht man das, wenn man zwischen den Tabs hin und her springt. Hat man einen Tab während einer Sitzung bereits einmal besucht, bekommt man zunächst den letzten Stand, der auf dem Client gespeichert ist angezeigt. Gleichzeitig wird jedoch ein API-Request abgesetzt um Updates vom Server nachzuladen.

Früher wurde immer die komplette Timeline neu vom Server angefordert. Das führte dazu, dass sich Twitter trotz asynchroner HTTP-Requests wie eine ganz gewöhnliche Website ohne AJAX anfühlte, weil einfach viel zu viele Daten nachgeladen wurden.

Generell sagt man ja “je weniger Requests, desto schneller die Seite”. Beobachtet man in Firebug, was passiert, wenn man auf einen Tweet klickt und so in der Sidebar die Details geladen werden, fällt jedoch auf, dass man bei den Twitter-Entwicklern gleich mehrere Requests an die API anstößt. Das hat mehrere Gründe, der wichtigste zuerst: Wollte man die Anzahl der Requests auf die API reduzieren, müsste man mehr Informationen über die einzelnen Schnittstellen ausliefern. Das bläht die Schnittstellen nicht nur auf, sondern nimmt auch jede Menge Flexibilität. Das Verteilen der Aufgaben auf die verschiedenen Cluster würde sich wesentlich schwieriger gestalten und unter Last wäre es relativ kompliziert, einzelne Features abzuschalten, ohne eine Reihe von Third-Party-Software kaputt zu machen.

Der zweite Grund für das Anfordern verschiedener Daten in mehreren Requests ist, dass “objektiv schnell” nicht gleich “subjektiv schnell” ist. Fordert man alle Daten auf einmal an, mag die Gesamtzeit für das Darstellen der Informationen geringer sein, der Zeitpunkt, zu dem der User das erste Mal etwas zu sehen bekommt, kommt jedoch wesentlich später. Die wichtigsten Informationen treffen durch dieses Prinzip früher beim User ein und vermitteln ein schnelleres Gesamtbild.

Mit #newtwitter haben die Entwickler einen großen Fortschritt gemacht: es werden mehr Informationen in kürzerer Zeit dargestellt und die Usability hat sich in meinen Augen zumindest für sehende Nutzer erheblich verbessert. Schafft man es jetzt noch, die Accessibility-Hürden aus dem Weg zu räumen, steht dem Erfolg nichts mehr im Wege.