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:
PHP 5.3.0-0.dotdeb.8 with Suhosin-Patch 0.9.7 (cli)
(built: Aug 12 2009 18:11:27)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies
Benchmark Ternär
<?php $sValue1 = 'foo'; $sValue2 = 'bar'; $iValueSum = 0; for($i = 0; $i < 90000000; $i++) { if($sValue1 === $sValue2) { $iValueSum += 1; } else { $iValueSum += -1; } }
<?php $sValue1 = 'foo'; $sValue2 = 'bar'; $iValueSum = 0; for($i = 0; $i < 90000000; $i++) { $iValueSum += ($sValue1 === $sValue2) ? 1 : -1 ; }
java version "1.6.0_12"
Java(TM) SE Runtime Environment (build 1.6.0_12-b04)
Java HotSpot(TM) Client VM (build 11.2-b01, mixed mode, sharing)
Benchmark Ternär
public class BenchReg { protected static int valueSum = 0; for(int i = 0; i < 90000000; i++) { if(value1 == value2) { valueSum += 1; } else { valueSum += -1; } } } }
public class BenchTrin{ protected static int valueSum = 0; for(int i = 0; i < 90000000; i++) { valueSum += (value1 == value2) ? 1 : -1; } } }
This is perl, v5.10.0 built for i486-linux-gnu-thread-multi
Benchmark Ternär
my $sValue1 = 'foo'; my $sValue2 = 'bar'; my $iValueSum = 0; for(my $i = 0; $i < 90000000; $i++) { if($sValue1 == $sValue2) { $iValueSum += 1; } else { $iValueSum += -1; } }
my $sValue1 = 'foo'; my $sValue2 = 'bar'; my $iValueSum = 0; for(my $i = 0; $i < 90000000; $i++) { $iValueSum += ($sValue1 == $sValue2) ? 1 : -1; }
Alle Benchmarks wurden auf der Kommandozeile unter Debian GNU/Linux Lenny ausgeführt. Die Zeiten wurden mit dem Kommandozeilen Tool time gemessen.
$ time php benchmark[1/2].php
$ time java benchmark[1/2]
$ time perl benchmark[1/2].pl
Wirklich überrascht hat mich nur das Ergebnis der Java-Benchmarks. Die PHP- und Perl-Benchmarks zeigten nur vernachlässigbare Performance-Unterschiede:

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.
22. September, 2009