WordPress und Performance – zwei Welten prallen aufeinander


Ich mag WordPress. Schließlich benutze ich es auch für diese Seite. Aber je mehr ich mich mit der Funktionsweise von WordPress beschäftige, desto weniger mag ich diese. Vor einiger zeit hatte ich bereits ein kleines Plugin entwickelt, dass das Laden von Übersetzungen auf den Moment verschiebt, an dem diese benötigt werden. Damit habe ich mich am letzten Wochenende mal wieder beschäftigt und bin dabei es weiterzuentwickeln (was auch gut klappt, dazu die Tage mehr).

Dabei, und beim Profilen des WordPress-Codes, stoße ich immer wieder auf ein grundlegendes Problem von WordPress: „Immer alles machen.“

WordPress macht kaum etwas „bei Bedarf“. Die Übersetzungen zum Beispiel: Bei jedem Aufruf einer WordPress-Seite werden alle Übersetzungen geladen und geparst. Das dauert. Und selbst bei einer Seite ohne irgendwelche anzuzeigenden (übersetzbaren) Texte/Strings werden mehrere hundert Texte/Strings übersetzt.

Beispiel: Die Label aller Taxonomien. Und damit sind nicht nur deren Namen gemeint, die ja ggf. noch im Frontend angezeigt werden könnten. Alle im Backend für die jeweilige Taxonomie verwendeten Label werden beim Registrieren der Taxonomie übergeben und an dieser Stelle auch automatisch übersetzt, egal ob nötig oder nicht. Und gibt eine Taxonomie keine eigenen an, dann werden Default-Werte verwendet, die jedes Mal neu übersetzt werden. Kein Holen der Label bei Bedarf. So etwas passiert an zig Stellen.

Bei einem englischen, also nicht übersetzten WordPress, fällt dies weniger auf, als beispielsweise bei einem deutschen, also übersetzten. Mehrere hundert unnötige Funktionsaufrufe kosten aber auch ohne aufwändige Übersetzung unnötig Zeit.

Und was ich mir bisher vom Code so angesehen habe, lässt mich insgesamt nichts gutes erahnen. WordPress scheint in vielen Bereichen ziemlich ineffizient zu sein.

Hier ein paar Messungen vom aktuellen Stand des Plugins, gemessen mit XDebug, getestet wurde mit einer simplen WordPress-Installation mit zwei Plugins (plus dem Optimierungs-Plugin) und einem Template, das keinerlei Übersetzungen verwendet:

  • ohne Plugin, englisch: 454 ms
  • ohne Plugin, deutsch: 801 ms
  • mit Plugin, englisch: 458 ms (Mich wundert, dass dies lansamer ist, als ohne Plugin, da einige Aufrufe eingespart wurden. Aber ich habe jeweils auch nur ein Mal gemessen. Vielleicht ist einer der Werte ein Ausreißer?)
  • mit Plugin, deutsch: 583 ms

Weiteren Optimierungen bzgl. der Übersetzungen (selbst mit Plugin wird noch 410 mal irgendwas übersetzt, zum Glück mehrfach das gleiche, sonst würde das noch mehr bremsen) lassen sich wahrscheinlich nicht im Plugin lösen. Hierfür dürfte ein direktes Eingreifen in den WordPress-Code nötig sein.

Vielleicht schaffe ich es die Tage eine erste Version des Plugins fertig zu stellen. Einen Namen habe ich immerhin schon: WP Performance Pack. Der Plan ist es, möglichst viele Optimierungen im Plugin unterzubringen. Sonstige Optimierungen gibt’s dann getrennt.