Layoutprobleme? - Styleswitcher!
![]() |
| | Themen-Optionen |
| | Nach oben #21 | |
| Jann Hendrik Bekaan Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 1.542
| ah.... array_slice() kannte ich nicht... Zitat:
btw: die Angabe type habe ich nun so übernommen: PHP-Code: derzeit sieht der case für list so aus: PHP-Code:
__________________ Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw. Danke! | |
| | |
| | Nach oben #22 | |||
| Lutz Registriert seit: 14.08.2005 Ort: Nienburg / Weser
Beiträge: 603
| Zitat:
Zitat:
Ich habe ein kleines Benchmark-Script geschrieben, mit dem ich jeweils pro Aufruf eine Million Durchläufe der entsprechenden Zeile teste. Für einen einigermaßen guten Durchschnittswert habe ich 10 mal das selbe Script aufgerufen: RegEx: Kürzester Durchlauf: 0,95406604 Längster Durchlauf: 0,97809410 Durchnittliche Zeit: 0,96451592 switch mit strtolower: Kürzester Durchlauf: 0,93610907 Längster Durchlauf: 0,95748019 Durchnittliche Zeit: 0,94841073 switch ohne strtolower: Kürzester Durchlauf: 0,53370285 Längster Durchlauf: 0,56261992 Durchnittliche Zeit: 0,54376390 in_array: Kürzester Durchlauf: 1,93268394 Längster Durchlauf: 1,95844913 Durchnittliche Zeit: 1,94565451 So, wie man sieht ist der RegEx garnicht soooooo langsam, wie du es hier darstellen wolltest. Hingegen ist deine Lösung bzgl in_array() weder schlanker, noch performanter, als der RegEx UND meiner Meinung nach auch noch sinnfreier, als ein RegEx - das ist aber wie gesagt Geschmackssache, ich wollte nur das Wort "Sinnfrei" nochmal einbauen Btw noch ein prozentualer Vergleich der einzelnen Möglichkeiten: switch ohne strtolower() : 100% switch mit strtolower() : ~174,42% regulärer Ausdruck : ~177,38% in_array() : ~357,81% Der RegEx ist übrigens gerade mal ca. 1,7% langsamer, als der switch mit strtolower() (wenn der switch mit 100% veranschlagt wird). Soviel dazu.
__________________ Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll | |||
| | |
| | Nach oben #23 |
| Jann Hendrik Bekaan Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 1.542
| sinnfrei sinnfrei.... nein - natürlich nicht. Danke dir für deine Mühe! Das erstaunt mich! Ich hätte gedacht, dass der RegEx schlechter abscheiden würde!
__________________ Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw. Danke! |
| | |
| | Nach oben #24 | |
| Johannes Müller Registriert seit: 15.09.2005 Ort: Königreich Flieden
Beiträge: 488
| Also das finde ich wirklich sehr erstaunlich Die Werte für switch und Regex entsprechen so in etwa meinen Vorstellungen. Dass aber in_array so aufwändig ist, hätte ich wirklich nicht gedacht... Das macht ja eigentlich auch nicht mehr als folgender Code, aber im Maschienencode, und hat eine lineare Ausführungszeit: PHP-Code: Ok, hab mir ma die Kommentare auf php.net angesehen: Zitat:
Man lernt immer wieder was neues... auch wenns irgendwie ziemlich verrückt ist also das sollte dann wohl um einiges schneller sein: PHP-Code: Ja, genau dazu sind Regex eigentlich da und nicht um zu überprüfen, ob ein einzelnes (!) Zeichen einem von fünf vordefinierten entspricht. Unabhängig von dem Ergebnis des Geschwindigkeitstests ist das wie mit Kanonen auf Spatzen zu schießen...
__________________ Weißt Bescheid - Scheiß wie weit | |
| | |
| | Nach oben #25 |
| Jann Hendrik Bekaan Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 1.542
| Wobei diese Kanonen wirklich erstaunlich gut treffen!
__________________ Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw. Danke! |
| | |
| | Nach oben #26 |
| Lutz Registriert seit: 14.08.2005 Ort: Nienburg / Weser
Beiträge: 603
| @$traight-$hoota: Ja, deine Schätzung kommt hin, der Durchschnittswert liegt bei ca. 0,54, also etwa gleichschnell wie switch ohne strtolower. Zu den RegEx selber muss ich sagen, dass ich da nicht deiner Meinung bin, denn letztendlich suche ich auch mit dem obigen RegEx einen Text - und finde ihn. Ob es sich dabei um komplexe BBCodes handelt oder schlicht um ein einzelnes Zeichen, spielt dabei keine Rolle. Und dass es performancemäßig keine große Rolle spielt zeigen die Benchmarks. Die Test-Datei sieht übrigens so aus: PHP-Code: PHP-Code: PHP-Code: PHP-Code: PHP-Code: Kleinste Dauer: 1,03227711 Größte Dauer: 1,05588198 Mittelwert: 1,04703190 Auch hier habe ich wieder 10 Scriptdurchläufe mit je einer Million Schleifendurchläufe gemessen. Es ist immernoch langsamer, als der RegEx, allerdings doch nicht so krass, wie ich es am Anfang gemessen hatte. Bei deutlich mehr Elementen wird sich das aber wohl doch wieder ins weit negativere verschieben, so wie du es schon zitiert hast. Ich bleibe halt dabei, dass es mit dem RegEx reine Geschmackssache ist und wohl auch bleiben wird. Um die schnellstmögliche Methode zu benutzen müsste man allerdings den Switch realisieren oder eben mit assoziativen Arrays arbeiten. Das bleibt einem selbst überlassen, die kürzeste Fassung bleibt aber wohl dennoch der RegEx. Es ist also an Jann sich zu entscheiden. Btw: Ich werde auch nochmal einen Test mit array_key_exists() anstellen, mal schauen, wie die sich in dieser Situation schlägt
__________________ Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
| | |
| | Nach oben #27 |
| Lutz Registriert seit: 14.08.2005 Ort: Nienburg / Weser
Beiträge: 603
| Hmm... interessant, jetzt auf ein Mal sagt mir mein Script, dass die isset()-Variante folgende Werte aufweist: Min: 0,18206596 Max: 0,21433187 Avg: 0,20084927 Ich hatte allerdings auch bevor ich die Werte nochmal protokolliert hatte Werte um 0,16 und 0,17. Scheinbar waren die ersten paar Durchläufe aus anderen Gründen etwas langsamer!? Nun gut, das oben sind jedenfalls jetzt Ergebnisse nach 10 Scriptaufrufen usw, ihr wisst ja bescheid. Für array_key_exists liegen die Ergebnisse auch vor: Min: 0,51477981 Max: 0,55369115 Avg: 0,54045768 Mag sein, dass ich vorhin aus versehen mit array_key_exists() gemessen hatte und es fälschlicher Weise als isset() eingetragen hatte, sorry. Die letzte Methode, die mir noch einfällt wäre dann ohne isset() direkt auf den Wert zuzugreifen: Min: 0,19494700 Max: 0,22789097 Avg: 0,21544781 Diese Methode hat jedoch zum Nachteil, dass - je nach Konfiguration von PHP - ein Notice geschmissen wird, was natürlich eine unsaubere Methode wäre. Meine Empfehlung nach den Tests ist nun also ganz klar zur isset-Variante mit vorher festgelegtem Array (notfalls halt als static-Array in der Klasse), da diese die Schnellste Abarbeitung mit sich bringt und die Übersichtlichkeit nicht so wahnsinnig einschränkt. Geht es jedoch nur darum den Code so klein wie möglich zu halten, würde meine Wahl auf den RegEx fallen, auch wenn dieser von manchen Leuten als sinnfrei erachtet wird
__________________ Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
| | |
| | Nach oben #28 | ||
| Benjamin Steininger Registriert seit: 02.06.2005 Ort: weiher im tiefsten Odenwald
Beiträge: 1.048
| Zitat:
Regex werden unter gewissen Umständen bei PHP gecacht, heißt, wenn du sie X mal hintereinander direkt (in einem script) ausgeführt werden, wird das ganze zwar sehr schnell, aber es lässt keine Rückschluss darauf zu, wie schnell der Regex wirklich im produktiven Einsatz ist, wo eben nur 1 mal oder wenige mal innerhalb eines Scripts zum Einsatz kommt. Die Infos hab ich von diesem Blogeintrag auf phpperformance.de. Zitat:
| ||
| | |
| | Nach oben #29 |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 745
| Ihr habt nicht das Gefühl, dass die Performance-Flaschenhälse woanders liegen, als hier? Ich meine, ein BB-Code verändert sich dann, wenn sich jemand hinsetzt und einen Beitrag schreibt. Derjenige wird sicherlich Verzögerungen im Millisekundenbereich verkraften können. Da wäre dann eher die Frage, wie das Caching aussieht etc. Ich weiß, ist hier nicht das Thema, aber auch in der Klasse gibt es sicherlich für die Performance gravierendere Entscheidungen, als dieses „ist das Zeichen eines von diesen 5?“ Basti |
| | |
| | Nach oben #30 | |
| Johannes Müller Registriert seit: 15.09.2005 Ort: Königreich Flieden
Beiträge: 488
| Zitat:
aber wie robo schon sagte, sind solche benchmarks nicht wirklich objektiv, da sie eben nicht die "echte" anwendung darstellen, sondern diese nur nachahmen.
__________________ Weißt Bescheid - Scheiß wie weit | |
| | |
| | Nach oben #31 |
| Lutz Registriert seit: 14.08.2005 Ort: Nienburg / Weser
Beiträge: 603
| Benchmarks haben ja im Grunde auch nur eine Art Hinweischarakter. Ich kann demnächst nochmal einzelne Aufrufe mit dem RegEx testen, alelrdings kann es dann sein, dass das Ergebnis recht mau ausfällt da die Zeitspanne nicht wirklich groß ist und man dann selbst microtime() an die Grenze des messbaren kommt...
__________________ Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
| | |
| | Nach oben #32 |
| Jann Hendrik Bekaan Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 1.542
| Da ich gerade dabei bin an dem code-tag (wie er hier auch im Forum vorkommt) zu basteln nutze ich mal diesen thread. -------- Alles könnte so schön sein. Ich füge einfach folgenden case hinzu: Code: case 'code':
$stringText = ' </p><div style="margin:20px; margin-top:5px">
<div style="margin-bottom:2px">Code:</div><pre style="margin:0px; padding:6px; border:1px inset; width: 100%; height:80px; overflow:auto">'.$stringText.'</pre></div><p> ';
break; Wenn ich dann Code wie diesen hier dort darstellen lassen will: Code: \documentclass[a4paper, 11pt]{scrartcl}
\usepackage[ngerman]{babel}
\usepackage[T1]{fontenc}
\begin{document}
\section{Überschrift}
Hier nun ein Text
\end{document} Hatz jmd. dazu eine Idee, wie man das vernünftig umsetzen kann? Derzeit hülle ich den Inhalt noch in ein noparse-tag, aber das kann ja keine Lösung sein...
__________________ Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw. Danke! |
| | |
| | Nach oben #33 |
| Lutz Registriert seit: 14.08.2005 Ort: Nienburg / Weser
Beiträge: 603
| Schreib mir bitte am WE oder so noch mal eine Mail, dann kann ich nach dem Problem mal schauen, aber momentan kann ich nicht ganz nachvollziehen, was mit dem String passiert, wenn du ihn nicht in noparse-Tags hängst...
__________________ Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
| | |
| | Nach oben #34 |
| Lutz Registriert seit: 14.08.2005 Ort: Nienburg / Weser
Beiträge: 603
| Manoman, das hat mich einige Zeit gekostet, den Fehler zu finden... Also: Im Tutorial hatte ich folgenden RegEx dazu benutzt, um die rekursive Abfrage zu gestalten: Code: $stringText = preg_replace_callback ('°\[(\w+)([^]]*)]((?:[^[]|\[(?!/?\1])|(?R))*)\[/\1]°',
'functionBBCode',
$stringText
); Code: $stringText = preg_replace_callback ('°\[(\w+)((?:\s|=)(?:[^]]*))?]((?:[^[]|\[(?!/?\1])|(?R))*)\[/\1]°',
'functionBBCode',
$stringText
); Ich werde gleich noch meinen Beitrag im Tutorial abändern und den Anhang auch verändern.
__________________ Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
| | |
| | Nach oben #35 |
| Jann Hendrik Bekaan Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 1.542
| Die Zeichensuppe - so möchte das mal bezeichnen - ist schon abgefahren. Ich steige da jedenfalls nicht mehr durch! Dir auf jedenfall ein dickes Danke!
__________________ Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw. Danke! |
| | |





