Performance Optimierung oder Wie man elf Pizzen optimal bestellt

Dienstag, 23.04.19. Gütersloh.

Gekürzte Projektbudgets, gestoppte Projekte. Das Wirtschaftswachstum kommt spürbar ins Stottern. Als externer Berater spürst du das als erstes, denn du sitzt in dem Fahrzeug mit der Vollbremsung. Ein abrupter Vorgang mit überraschender Wucht.

Ich habe ein wenig Glück, ich befinde mich lediglich in einem Leerlauf zwischen zwei Projektphasen. Daher versucht mein Kunde, mich mit Aufgaben zu versorgen. In diesen Phasen werden dann auch mal Dinge in Auftrag gegeben, die sonst leider häufig vernachlässig werden. Die Performance-Optimierung der Software ist eines dieser stiefmütterlich behandelten Kinder (den seltsamer Weise alle Kunden für wichtig erachten), denn der Kunde geht per se davon aus, dass alles, was umgesetzt wird, optimiert wurde und schnell läuft. Diese Annahme ist verständlich, aber falsch.

Egal aus welcher Motivation heraus ich Aufgaben dieser Art bekomme, ich freue mich immer über sie. Optimierung ist eine besondere Herausforderung und gleicht einer Detektivarbeit: Du musst den Übeltäter aufspüren und dazu seine Motivation verstehen. Anschließend gleicht es einem chirurgischen Eingriff, um die Stelle im Coding zu optimieren, ohne dabei Schäden an anderer Stelle anzurichten (Vermeidung von Seiteneffekten).

Ein Übeltäter, ein Detektiv und ein Chirurg – was hat das mit Pizza zu tun? Ganz einfach, ich mag Pizza! Die meisten der Performance-Probleme, die ich analysiert und verbessert habe, kann ich auf ein simples, sich wiederholendes Prinzip zurückführen: auf Datenbankselektionen innerhalb einer Schleife. Und das werde ich anhand einer absurden Pizzabestellung veranschaulichen.

Stell dir vor, zehn Freunde kommen dich spontan besuchen. Ihr verbringt einen lustigen Abend gemeinsam. Früher oder später bekommt die oder der eine Hunger. Dann der oder die Nächste. Am Ende wollen alle etwas essen. Also schlägst du vor, bei deiner Lieblingspizzeria etwas zu bestellen und alle wollen Pizza.

Du rufst dort an.

»Eine Pizza Thunfisch mit Zwiebeln.« Das Bitte! hauchst du schnell hinterher, denn du bist höflich und möchtest dennoch um Eile bitten.

Dann legst du auf.

Nach einer halben Stunde wird die Pizza heiß geliefert. Du drückst das herrlich duftende Paket deinem ersten Gast in die Hand. Dann bestellst du die zweite Pizza: »Eine Pizza Chicken mit Jalapeños, bitte!« Klingt auch lecker!

Du legst wieder auf.

Kaum eine halbe Stunde später trifft auch diese Pizza bei dir ein. Du überreichst sie deinem zweiten Gast, der sie haben wollte. Langsam beginnt dein Magen drohend zu knurren, er möchte auch seine Pizza haben und zwar pronto! Also eilst du zum Smartphone und machst deine nächste Bestellung, nur keine Zeit verlieren.

So geht es weiter, bis du für alle zehn Besucher und zuletzt für dich – denn als guter Gastgeber machst du das so – eine Pizza geliefert bekommen hast.

Jetzt stellst du fest, ein Getränk wäre doch auch toll! Und der Einzelbestellprozess geht von vorne los. Hurra!

Das klingt absurd. Und doch, wenn man es programmiert, ist diese Variante viel einfacher umzusetzen, als gleich alle Pizzen für alle gemeinsam zu bestellen.

Aus zwei Gründen: Zum einen war jede Pizzalieferung für sich schnell, halt nur nicht in der Gesamtlaufzeit. Zum anderen gibt es am Ende immer eine Herausforderung. Wenn alle Pizzen gleichzeitig geliefert werden, dann geht die chaotische Suche nach der eigenen Pizza los.

Für das Programm bedeutet die Verteilung der Pizzen, dass es am Ende die jeweilige Pizza dem richtigen Besteller zuordnen muss.

Das klingt alles recht einfach, ist es aber in der Praxis nicht. Denn diese absurden »Bestellprozesse« verstecken sich häufig in hunderten von Zeilen Coding und nie geht es um Pizza!

Weiterhin treten die Performance Probleme erst bei hohen Volumina (also großen Datenmengen) auf. Wenn dich plötzlich 40 weitere Gäste vor deiner Bestellung überraschen, wäre es nicht besonders klug, 51 Pizzen bei einer einzigen Pizzeria gleichzeitig zu bestellen (hast du schon Mal 51 Pizzen bestellt? Ich noch nie). Natürlich ist die 51-malige Einzelbestellung noch schlechter.

Eine Optimierung ist also nicht so einfach umzusetzen, auch wenn die Ursache offensichtlich ist.

Ich habe jetzt so viel über Pizza geschrieben, jetzt habe ich Lust darauf! Das ist übrigens eines der unbekannten Seiteneffekte, von denen niemand berichtet.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.