Kurz: Ternär-Operator im Benchmark
Kaum eine Programmiersprache hat ihn nicht: Den Ternär-Operator (engl.: ternary operator).
Manche Entwickler meiden ihn da er die Lesbarkeit erschweren soll. Andere setzen ihn ein um die Übersichtlichkeit von Methoden zu erhöhen (mich eingeschlossen). Hier wird jedoch nicht der Einsatz diskutiert, sondern die Geschwindigkeit des Operator gegenüber der herkömmlichen If-Abfrage gemessen. Die Benchmarks beschränken sich dabei auf PHP, Java und Perl.
Die Benchmarks sind ziemlich trivial:
- Zunächst werden die Variablen initialisiert. Dabei handelt es sich in allen Sprachen um zwei Variablen vom Typ String sowie eine Variable vom Typ Integer
- In einer For-Schleife, die 90.000.000 Mal durchläuft, werden die beiden Strings jeweils per If-Abfrage und per Ternär-Operator verglichen. Ist der Vergleich wahr, wird die Integer-Variable um 1 inkrementiert, sonst um 1 dekrementiert.
Testszenario
PHP
Version
Benchmark If / Else
Benchmark Ternär
Java
Version
Benchmark If / Else
Benchmark Ternär
Perl
Version
Benchmark If / Else
Benchmark Ternär
Ausführung
Alle Benchmarks wurden auf der Kommandozeile unter Debian GNU/Linux Lenny ausgeführt. Die Zeiten wurden mit dem Kommandozeilen Tool time gemessen.
Ergebnis
Wirklich überrascht hat mich nur das Ergebnis der Java-Benchmarks. Die PHP- und Perl-Benchmarks zeigten nur vernachlässigbare Performance-Unterschiede.

9 Kommentare
Jetzt wäre noch interessant, ob die if-Abfrage noch an Performance gewinnen könnte, wenn im else-Zweig statt
$iValueSum += -1;
Folgendes notiert wäre:
$iValueSum -= 1;
oder
$iValueSum—;
Das dürfte ja eigentlich keine weiteren Performance-Zuwächse bringen, aber man weiss ja nie.
Nichtsdestotrotz entkräftet dieses Benchmark auf jeden Fall die Low-Performance-Agumente der Ternär-Gegner.
Absolut!
Genau aus diesem Grund hab ich bei allen Benchmarks exakt das gleiche Verfahren verwendet um dort keine Abweichungen einzubauen.
Netter Beitrag, aber ihr wollt mir doch nicht wirklich weismachen, dass die Schreibweise des ternären Operators wirklich die Lesbarkeit erhöht. Also ich müsste da erst mal ‘ne Weile drauf schauen. Kann aber auch daran liegen, dass ich ? nicht benutze.
Was mir gerade noch einfällt
Könnte es nicht sein, dass der Unterschied bei PHP auf 0% sinkt, wenn man einen Bytecode Cache verwendet? Ich tippe mal drauf, dass im Bytecode beide Anweisungen sehr sehr ähnlich aussuchen.
Das würde ja auch dagegen sprechen, dass der ternär Operator langsam wäre.
Hi Nils,
public function beispiel() {
return (condition) ? true : false;
}
ich finde das ist wesentlich lesbarer als:
public function beispiel() {
if(condition) {
return true;
}
else {
return false;
}
}
LG
Adrian
Nachtrag: Zumindest steigt die Übersichtlichkeit einer Klasse
Mir ging es eher um:
$iValueSum += ($sValue1 === $sValue2) ? 1 : -1 ;
Aber das passt schon
Habe mich damit abgefunden, dass es einfach Geschmackssache ist.
Bei dem Beispiel hast du natürlich recht - es ist nicht lesbarer.