IF-Statements optimieren

Mischa Sameli, Geschäftsführer & Leiter Entwicklung

Es gibt Befehle, die braucht man jeden Tag. 100fach. Und dazu gehören natürlich IF-Statements. Was gibt es schon einfacheres im Programmieralltag, als irgendeinen Fall noch mit einem IF blabla abzufangen. Oder eine existierende Abfrage noch zu erweitern um einen Fall. Alles ganz einfach, denkt man, und verschenkt dabei immer wieder Performance.

Wieso? Ein Beispiel: Folgende Bedingungen sollen erfüllt sein: Der Benutzer muss ein komplexes Passwort vergeben, sofern das System ein komplexes Passwort erwartet. In Code umgemünzt:

1&lt;<cfif IstUserPasswortKomplex OR Not KomplexesPasswortErforderlich>
2
3</cfif>
Zugegeben, das sieht logisch aus und entspricht dem Text der Beschreibung. Und es funktioniert auch. Nur: die Effizienz ist nicht optimal. Wieso? Im Detail: Wir haben zwei Abfragen IstUserPasswortKomplex und KomplexesPasswortErforderlich. Eine der beiden Bedingungen muss also erfüllt sein. Oder anders ausgedrückt: Wenn eine Bedingung erfüllt ist, ist der ganze Ausdruck erfüllt. Will heissen, wenn der erste Ausdruck bereits wahr ist, muss der zweite gar nicht mehr evaluiert werden. Mit diesem Wissen im Hintergrund lässt sich die IF-Abfrage leicht neu schreiben:
1<cfif Not KomplexesPasswortErforderlich OR IstUserPasswortKomplex>
2
3</cfif>
Nun wird zuerst ein simpler Boolean-Wert überprüft (KomplexesPasswortErforderlich : ja/nein). Diese Abfrage ist sehr effizient und ressourcenschonend. Erst wenn diese Abfrage nicht zutrifft, wird der zweite Ausdruck evaluiert. Und der hats schon eher auf sich. Da muss sicher mehr gerechnet werden als nur auf ja oder nein überprüft werden. Die Moral von der Geschicht: Komplexe Berechnungen oder Vergleiche nur dann anstellen, wenn auch unbedingt nötig. Oder: Optimierungspotential gibts fast überall. Und in Zahlen ausgedrückt, eine kleine Testreihe mit 1000 Passwörtern: KomplexesPasswortErforderlich: nein: Variante 1: 140 ms Variante 2: 0 – 16ms KomplexesPasswortErforderlich: ja: Variante 1: 140 ms Variante 2: 140 – 150 ms Man sieht: selbst wenn beide Ausdrücke evaluiert werden müssten, hat man keinen merklichen Geschwindigkeitsnachteil in Kauf zu nehmen. Also spielt es eigentlich keine Rolle mehr, ob der Standardwert KomplexesPasswortErforderlich eher ja oder nein ist.