Unterstützung " und ' als Attribut-Abgrenzung

Dieser Bereich dient dazu, neue Features zu diskutieren und für die Entwicklung zu dokumentieren. // This area is dedicated to new features including proposals and documentation.
Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von dr.e. » 13.08.2012, 21:35:06

Thema abgetrennt von Eclipse PDT - TagLibs.

Hallo Jan,

wir können das Thema gerne auf die Roadmap setzen für sagen wir 1.17?
Das wäre ebenso eine mögliche Lösung. Das hat jedoch deutliche Auswirkungen auf die Performance des XmlParsers. Details kannst du in Zeile 403ff der pagecontroller.php einsehen.
Ich habe heute im Zug einige Tests durchgeführt und eine Implementierung getestet, die folgende Konstellationen akzeptiert:

Code: Alles auswählen

<lang:umgtimport
               namespace="sandbox::pres::templates"
               template="navi"
                     />
<lang:umgtimport
               namespace="sandbox::pres::templates"
               template='navi'
                     />
<lang:umgtimport
               namespace='sandbox::pres::templates'
               template='navi'
                     />
Gemischte Delimiter funktionieren nicht, wäre aber auch quatsch. Ergebnis für 100000 Iterationen:
getAttributesFromStringOld($normal): 0.80685901641846 s
getAttributesFromStringNew($normal): 0.82324004173279 s
getAttributesFromStringNew($mixed): 0.86114001274109 s
getAttributesFromStringNew($single): 0.92230606079102 s
In Relation ausgedrückt:
Relative difference $normal -> $normal: 2.0302215109455 %
Relative difference $normal -> $mixed: 6.7274449709415 %
Relative difference $normal -> $single: 14.30820527792 %
Ferner habe ich den Skalierungsfaktor getestet, der sich durch weitere Attribute ergibt. Hierzu wurden folgende Strings gebildet:

Code: Alles auswählen

<lang:umgtimport
               namespace="sandbox::pres::templates"
               template-one="navi"
               template-two="navi"
               template-three="navi"
                     />
<lang:umgtimport
               namespace="sandbox::pres::templates"
               template-one='navi'
               template-two="navi"
               template-three='navi'
                     />
<lang:umgtimport
               namespace='sandbox::pres::templates'
               template-one='navi'
               template-two='navi'
               template-three='navi'
                     />
Ergebnisse:
getAttributesFromStringOld($normalDouble): 1.4646470546722 s
getAttributesFromStringNew($mixedDouble): 1.2266728878021 s
getAttributesFromStringNew($singleDouble): 1.707307100296 s
In Relationen:
Relative difference $normal -> $normalDouble: 81.524532151059 %
Relative difference $mixed -> $mixedDouble: 42.447554364302 %
Relative difference $single -> $singleDouble: 85.112857095588 %
Das bedeutet:
Zur Unterstützung von sowohl " als auch ' als Delimiter wird der Parser 5% langsamer sein. Verdoppelt sich die Anzahl der Attribute so skaliert die Zeit mit ~80%.

Mein Anspruch ist, dass das APF weiterhin den besten Footprint unter den PHP-Frameworks besitzt und diese Eingriff wird sicher keinen positiven Impct darauf haben. Um eine endgültige Abschätzung tätigen zu können werde ich noch 2 Lasttests auf meinen Testservern vornehmen und die Sandbox in 3 Tests (Setup siehe oben) mit testen.
Viele Grüße,
Christian

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: Eclipse PDT - TagLibs

Beitrag von jwlighting » 14.08.2012, 11:39:35

Hallo Christian,

vielen Dank für die Mühe und die Tests. Ich würde vorschlagen, wir verwerfen den Ansatz mit den einfachen Anführungszeichen, denn:
Mein Anspruch ist, dass das APF weiterhin den besten Footprint unter den PHP-Frameworks besitzt und diese Eingriff wird sicher keinen positiven Impct darauf haben.
Und das sehe ich genauso. Das ist mir valides (X)HTML in den Templates mit funktionierendem Syntaxhighlighting auch nicht wert.

Die Möglichkeit mit den {NAME}-Placeholdern sollte da der bessere Weg sein.
wir können das Thema gerne auf die Roadmap setzen für sagen wir 1.17?
Gerne. Für wann ist den ein RC von 1.16 geplant?

Zuletzt: Magst du die Beiträge (ab #11964) vielleicht auslagern ins Forum "Neue Features" mit Threadtitel "Placeholder in HTML-Attributen suboptimal"?


LG :)

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Eclipse PDT - TagLibs

Beitrag von dr.e. » 14.08.2012, 14:23:36

Hallo Jan,

ich habe heute noch weitere Tests durchgeführt und habe noch einen Punkt gefunden, mit dem wir die Performance noch etwas verbessern können. Gib mir bitte noch ein wenig Zeit, dann habe ich eine abschließende Aussage.
Viele Grüße,
Christian

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Eclipse PDT - TagLibs

Beitrag von dr.e. » 16.08.2012, 23:05:57

Kurzer Zwischenstand (für mich als Notiz):

Code: Alles auswählen

1) 1x trim() + " and ' support (new)
2) 1x trim() + " support (partly new)
3) 2x trim() + " support (old)

-------| 1     | 2     | 3     |
Test 1 | 3115  | 3114  | 3145  |
Test 2 | 3173  | 3057  | 3178  |
Avg    | 3144  | 3086  | 3162  |
%->old | -0,5% | -2,5% | +/-0% |
Erstes Fazit: mit etwas Code-Optimierung ist es zu schaffen, den Parser bei gleichzeitiger Unterstützung von ' und " mindestens genauso schnell zu belassen.

Ich teste weiter.
Viele Grüße,
Christian

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von dr.e. » 17.08.2012, 20:42:54

Hallo Jan,

meine abschließenden Tests zeigen, dass die neue Implementierung (Support von " und ')
  • bei Verwendung von ausschließlich " als Delimiter nahezu gleich schnell ist,
  • bei Verwendung einer Mischform an Delimitern einbricht,
  • und bei steigender Anzahl an Attributen und einer Mischform an Delimitern schlechter skaliert.
Ich würde daher gerne den Support von ' nicht mit in das APF aufnehmen um die Performance nicht zu negativ zu beeinflussen.

Als alternative Implementierung habe ich

Code: Alles auswählen

public static function getAttributesFromString($attributesString) {
   $attributes = array();
   preg_match_all('~([A-Za-z0-9\-_\.]+)(\s?)+=(\s?)+("|\')(.+)(\\4)(\s)~Ui', $attributesString, $matches, PREG_SET_ORDER);
   foreach ($matches as $match) {
      $attributes[$match[1]] = $match[5];
   }
   return $attributes;
} 
getestet, da die Ergebnisse im isolierten Test sehr gut waren (z.B. 0.24723887443542s statt 0.56445002555847s). Im kombinierten Test gegen die Sandbox-Startseite waren die Zeiten jedoch mal darüber den zuvor gezeigten, mal darunter.
Viele Grüße,
Christian

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: Eclipse PDT - TagLibs

Beitrag von jwlighting » 18.08.2012, 13:36:30

Ok, nachvollziehbar. Dank dir für die großen Anstrengungen und umfangreichen Tests.

Wollen wir dann eine Methode setStringPlaceholder() in base_controller und html_taglib_placeholder (und template_taglib_placeholder, falls noch nötig) einbauen?
Die Frage wäre noch, ob wir dann beim Methodenaufruf direkt den String ersetzen, oder Placeholderkey zu Wert erst zwischen speichern und beim Tranform ersetzen. Letzteres hätte den Vorteil, dass sich der Wert wie bei den Taglibs mehrfach setzen lässt, erfordert aber auch tiefere Eingriffe.

Letzte Möglichkeit wäre eine generische Taglib <html:tag name="tagname"></html:tag>, dessen Attribute und Inhalt sich dann ja sehr flexibel manipulieren liessen. Der Tagname muss dann allerdings auch als Attribut angegeben werden. Und bei zu häufiger Verwendung vermutlich auch nicht so toll für die Performance. Außerdem hätte man so zwar valides XML, muss aber auch aufs Hilfsfunktionen der IDE wie Tag-/Attributvorschläge und Validierung des HTMLs verzichten.

LG :)
Jan

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Eclipse PDT - TagLibs

Beitrag von dr.e. » 18.08.2012, 15:52:55

Hallo Jan,
Ok, nachvollziehbar. Dank dir für die großen Anstrengungen und umfangreichen Tests.
Gerne. Ich habe mir gestern Abend das Thema nochmals angesehen (hat mir keine Ruhe gelassen) und ich bekomme irgendwie immer wieder divergente Ergebnisse. Mal ist die eine Variante schneller/langsamer, dann wieder umgekehrt. Irgendwie ist beim Testaufbau noch der Hund drin. Ebenfalls habe ich mir nochmal die Implementierung per RegExps angesehen und diese scheint auf den ersten Blick Faktor 3 schneller, bei Lasttests mit einer kompletten Seite jedoch genauso schnell. :roll: Irgendwie muss ich mir mal mehr Zeit nehmen um das zu evaluieren oder einen Test schreiben, den ihr bei euch auf den Rechnern ausführen und die Ergebnisse posten könnt. Vielleicht bekommen wir dann relevantere Ergebnisse.
Wollen wir dann eine Methode setStringPlaceholder() in base_controller und html_taglib_placeholder (und template_taglib_placeholder, falls noch nötig) einbauen?
Ich würde die Methode gerne in den base_controller einbauen. Dort hast du den relevantesten Anwendungsfall. In den Placeholder-Tags brauchen wir die IMHO nicht, denn diese werden ja bereits per setPlaceHolder() befüllt.
Die Frage wäre noch, ob wir dann beim Methodenaufruf direkt den String ersetzen, oder Placeholderkey zu Wert erst zwischen speichern und beim Tranform ersetzen. Letzteres hätte den Vorteil, dass sich der Wert wie bei den Taglibs mehrfach setzen lässt, erfordert aber auch tiefere Eingriffe.
Wiederverwenden lässt sich der String ja nicht, da es von ihm keine Instanz gibt. Es sei denn du schreibst einen Tag, der darin vorkommende Strings mit {FOO} als eigene Instanzen z.B. von string_taglib_placeholder erzeugt.
Viele Grüße,
Christian

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Eclipse PDT - TagLibs

Beitrag von dr.e. » 25.08.2012, 11:51:55

Nachtrag zu oben: Tests zur Performance sind in der Mache.
Kurzes Update: ich habe die einfachen Tests für die reine Performance der XmlParser::getAttributesFromString() und XmlParser::getTagAttributes() abgeschlossen. Aktuell steht noch die Implementierung einer kombinierten Prüfung samt Node-Parser an.

Dabei habe ich festgestellt, dass das Mischen von Delimitern mit der aktuellen Implementierung nicht möglich ist. Eine Alternative ist die Implementierung per RegExp, die grundsätzlich einen guten Eindruck macht.

Updates soon... :)
Viele Grüße,
Christian

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von dr.e. » 25.08.2012, 17:18:31

Hallo Jan,

ich habe nun ein Test-Setup zusammengestellt und auf unterschiedlichen Umgebungen und PHP-Versionen >=5.2 ausgeführt. Das Ergebnis ist quasi unentschieden mit einer leichten Tendenz zur RegExp-Umsetzung. Leider schwanken die Ergebnisse tatsächlich sehr deutlich und eine Auswertung ist nicht so ganz einfach.

Ter Test kann hier heruntergeladen werden:
XmlParser-Test.tar.gz
(778.91 KiB) 133-mal heruntergeladen
Nach dem Ausführen über CLI oder HTTP erzeugt er CSV-Dateien im Format

Code: Alles auswählen

Test;duration for 10000 iterations
testGetAttributesFromString;Release115;$normal;0,88963079452515
testGetAttributesFromString;Release115;$normalDouble;1,4843599796295
testGetAttributesFromString;Current;$normal;0,79567193984985
...
Um eine breitere Aussage zu bekommen möchte ich euch aufrufen, den Test auf allen verfügbaren Maschinen auszuführen und hier zu posten. Danke!
Viele Grüße,
Christian

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von jwlighting » 26.08.2012, 11:43:25

Hallo Christian,

ich werde mich da nachher dran setzen.
Vielen Dank auch fürs Splitten des Themas ;)

LG :)
Jan

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von jwlighting » 26.08.2012, 13:27:23

So, hier jetzt meine Ergebnisse.

4 von meiner lokalen Maschine, und 2 - die nicht ganz fertig geworden sind... ;) - von einem Hetzner Server (das Webhostingpaket mit 4GB)
Wenn ich noch an andere Maschinen komme, reiche ich was nach.

LG :)
Jan

PS: Vielleicht solltest du den Upload von csv-Dateien erlauben... ;)
Dateianhänge
XMLParserTest.zip
(4.89 KiB) 201-mal heruntergeladen

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von dr.e. » 26.08.2012, 22:25:09

Hallo Jan,

herzlichen Dank für deine Tests!

Wie ich fast befürchtet hatte zeigen mir deine Tests, dass die aktuelle Implementierung einfach die schnellste ist! :roll:

@all: hat irgendjemand sonst noch Zeit die Tests auszuführen? Würde mir sehr helfen.
Viele Grüße,
Christian

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von jwlighting » 28.08.2012, 20:19:26

Gerne.
Wie ich fast befürchtet hatte zeigen mir deine Tests, dass die aktuelle Implementierung einfach die schnellste ist!
Ich hätte die Ergebnisse bearbeiten oder den Server manipulieren sollen ... :ugeek: :twisted:

Ich versuch dir nochmal ein paar Testergebnisse zu organisieren.

LG :)
Jan

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von dr.e. » 28.08.2012, 22:46:41

Ich versuch dir nochmal ein paar Testergebnisse zu organisieren.
Super, danke!
Viele Grüße,
Christian

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von dr.e. » 01.09.2012, 11:48:54

*push* Ich würde mich über weitere Tests freuen! :)
Viele Grüße,
Christian

Gesperrt

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast