Seite 1 von 1

PHP Effizienz: if elseif vs. switch case vs. ternaer ?:

Verfasst: 21.05.2008, 23:48
von Airport1
Hats schon jemand gemessen und kann das hier bestaetigen?:

https://www.php-performance.de/kontroll ... ernaer.php

ich hatte mal switch case gegen if antreten lassen , 1 mio. mal, bei mir wars aber ungefaehr gleich schnell? bringt der ternaere operator wirklich soviel speed up? muss ich das selber nachmessen oder hats schon jemand gemacht ,)

Verfasst:
von
SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


Verfasst: 22.05.2008, 04:05
von net(t)worker
traue keiner Statistik die du nicht selber gefälscht hat.... irgendwie irgenwo ein Grundsatz.... :wink:

do it... 8)

Verfasst: 23.05.2008, 05:58
von everflux
Wann braucht man denn wirklich eine so ausgefeilte Optimierung? Ich würde den Sinn des ganzen unter ökonomischen Gesichtspunkten in Frage stellen.
In der Regel lohnen sich Optimierungen wenn man Performanceprobleme analysiert, klassifiziert und priorisiert hat.
Aber einfach wild drauf los Operatoren zu tauschen weil man bei einer Million Aufrufe (bei der aktuellen Zend Engine!) vielleicht ein wenig sparen könnte - klingt nicht durchdacht.

Verfasst: 23.05.2008, 10:21
von Airport1
> Wann braucht man denn wirklich eine so ausgefeilte Optimierung?

wenn man user hat, die sich darum streiten welche variante eines scripts 0,0046 oder eben nur 0,0004 sec braucht. natuerlich leidet die transparenz des codes unter dem ganzen, insbes. wenn man den ternaeren operator verwendet. die schnellere laufzeit faellt natuerlich erst dann ins gewicht wenn die methode z.b. zig tausend mal in einem kleinen intervall zur ausfuehrung kommt.

das hoehere ziel ist jedoch auch das wissen darum was schneller ist. in einer kuerzlichen diskussion meinte jemand ein switch case sei auf jeden fall IMMER viel viel schneller als ein if. dies scheint jedoch meist nur bei compilierten sprachen so zu sein, da diese wohl hashen, und bei einem if else ... alles ablaufen. bei messung mittels php zeigte sich eher ein gleichstand.

ich finde solche ueberlegungen sehr interessant, auch wenn sie fuer den alltagsgebrauch wohl weniger die rolle spielen. will ja schliesslich noch was dazu lernen, vertiefe mich daher z.b. auch gerade (wieder) in b+ baeume ;-)

Verfasst: 23.05.2008, 10:38
von everflux
Es gibt für PHP neben der Zend Engine ja noch die Implementierung von Caucho (Quercus) - ich kann mir gut vorstellen, dass sich dort einiges völlig anders verhält.
Genauso erwarte ich, dass sich mit PHP 6 und der Zend Engine wieder "IMMER richtige Aussagen" zum Teil erledigen.
Der ternäre Operator ist ein Sprachkonstrukt, welches eigentlich in ähnliche wenn nicht gar identische OP-Codes verwandelt werden sollte. Hast Du mal den von Zend generierten Code disassembliert, oder Dir die Sourcen angeschaut?

Abschließend meine Meinung zu dem Thema:
(OP-Code) Caches, die zugrunde liegende Maschine (Cache Größe des Prozessors etc.), die Implementierung von PHP (Zend, Quercus) etc. haben wesentlich größeren Einfluß als solche mikro-benchmarks suggerieren.

Wenn Dein Script so mega wichtig ist, dann
- bau es handoptimiert in C und nicht in PHP.
- schau dir die richtigen Dastenstrukturen an (z.B. bäume statt linearer listen)
- schau was du alles bereits vorher verarbeiten kannst
- apc/eaccelerator, memcache, mysql query cache sind ebenfalls deine freunde

Verfasst: 23.05.2008, 10:43
von Airport1
ich wollte hier keinen "glaubenskrieg" ausloesen, oder eine diskussion wie man es ins extrem treiben kann. mit sowas kommt man sowieso nie zu einer loesung die alle befriedigt, und kann endlose threads fuehren.

es war nur eine frage zur derzeitigen (!) (standard-)implementierung (zend) ;)

denke das thema ist (fuer mich, fuer meine belange) fertig, aber wenn du magst kannst du noch hierzu was sagen ;)
https://www.abakus-internet-marketing.d ... 56932.html

Verfasst: 23.05.2008, 13:15
von everflux
Ich habe die Sachen von der Webseite mal genommen, um selber etwas zu testen.
Hier zwei Läufe - der erste ohne eaccelerator, der zweite mit

new: 0.045581
switch
new: 0.088761
ternaer
new: 0.023465
if elseif
new: 0.087181

schachtel if else
new: 0.046576
switch
new: 0.088093
ternaer
new: 0.023454
if elseif
new: 0.085592

scheint sich bei diesem micro-benchmark also nicth auszuwirken. da man ansonsten aber deutlich verbesserte lade-/laufzeiten hat, sehe ich das als weiteres indiz dafür, dass diese teststellung unsinnig ist.

Verfasst: 24.05.2008, 03:10
von To-Bi-As
Also die Ternären Operatoren sind um Längen schneller, aber die Übersichtlichkeit ist eine Katastrophe.

if/elseif 0.31394982338
case 0.365222930908
ternär 0.0782749652863

Alle sind 1000 mal durchgelaufen. Die Angabe ist ein Mittelwert.

Wenn ich aber bedenke, dass das sicherlich für die Bot-Trap sein soll, dann ist das Ternäre fast ein Unding, auch wenn es schneller ist.

Gruß, Ingo

Verfasst: 24.05.2008, 07:58
von everflux
Da es semantisch keinen Unterschied macht, gehe ich davon aus, dass es sich da um eine Chance handelt, die Zend Engine deutlich zu beschleunigen.
Ich würde das auf der php-dev Mailingliste mal posten/diskutieren.

Für Bot-trap: Hier kann man deutlich performance rausholen wenn man eine andere datenstruktur als eine lineare liste wählt. (weiß ja nicht, wie es aktuell aussieht, die alte version die ich mal irgendwie in die finger bekam verwandte so einen wirklich üblen "suchalgorithmus" :) )

Du kannst ja beliebig viel Aufwand bei der Generierung der Datenstruktur betreiben, denn da hast du ja viel "Zeit". Der Zugriff nachher ist das, was teuer ist.

Ich könnte mir vorstellen, dass das Projekt - ähnlich wie Snort - davon profitieren würde, wenn die Software selber nicht hinter verschlossenen Türen gepflegt wird. Die "geheimen" Daten, die nachher zur Klassifizierung verwendet werden, können ja dann weiter mit biometrie-personalausweis-kontroll-verfahren verteilt werden.

Verfasst: 24.05.2008, 12:11
von Airport1
> Hier kann man deutlich performance rausholen wenn man eine andere datenstruktur als eine lineare liste wählt. (

die wuerde ich ja zu gerne sehen, aber bedenke: ohne datenbank! oft denkt man das dies oder jenes viel schneller sein muesste, doch misst man es dann denkt man sich nur noch: "WTF?". ein grausames beispiel dafuer siehe uebernaechsten absatz. hab mir daher shcon ueberlegt ob ich fuer nicht-datenbank-habende die sqlite struktur quasi selber nachbaue, mit einer binaerdatei in der man mittels b+ baum das richtige schnell findet ;) aber noch such ich nach ner transparenteren loesung, sonst heisst es naemlich gleich wieder: "warum ist das verschluesselt?" ;)

eine super duper suchstruktur ohne datenbank artet in einen wirklich uebelsten code aus, wie ihr schon selber anmerkt. ich hatte mal angefangen mir auf papier aufzumalen wie ein binaerer baum in php aussehen muesste, aber das kann man niemand antun.

habe einen neuen beitrag erstellt, da dieser doch zu sehr von diesem abweicht, hier:
https://www.abakus-internet-marketing.d ... tml#479749