2010-03-24 11 views
7

Die neueren Versionen von Coldfusion (ich glaube, CF 8 und 9) können Sie structs mit Objektliteral Notation ähnlich wie JSON erstellen.Coldfusion structs direkte Zuordnung vs Objektliteral Notation

Meine Frage ist, gibt es bestimmte Vorteile (Ausführungseffizienz vielleicht) zur Verwendung von Objektliteral Notation über die einzelnen Zuweisungen für Daten, die im Wesentlichen statisch ist?

Zum Beispiel:

Mit einzelnen Zuweisungen Sie so etwas tun würde:

var user = {}; 
user.Fname = "MyFirstnam"; 
user.Lname = "MyLastName"; 
user.titles = []; 
ArrayAppend(user.titles,'Mr'); 
ArrayAppend(user.titles,'Dr.'); 

Während bei Objektliterale Sie so etwas wie tun würde.

var user = {Fname = "MyFirstnam", 
      Lname = "MyLastName", 
      titles = ['Mr','Dr']}; 

Nun ist dieses begrenzte Beispiel ist zwar einfach, aber wenn Titel war eine Reihe von Strukturen (Say eine Reihe von Adressen), die wörtliche Notation wird umständlich zu arbeiten.

Antwort

4

Bevor ich alles versuchte, dachte ich sofort, dass Literale schneller wären, da Sie alles, was Sie zur Laufzeit brauchen, erstellen und keine Zeit mit der Erstellung von Variablen verschwenden müssen, dann Funktionen aufrufen und alles anhängen.

Ich schrieb dann einen kleinen Test, die ein Diagramm mit den Ergebnissen. Du hast mich dort gespannt :-)

Die Ergebnisse beweisen, dass ich Recht hatte, wie die Grafik, die eine Staffelung Differenz zeigt, wie Sie sehen können: alt text http://i44.tinypic.com/jiz8lw.jpg

Aber denken Sie daran, dass, obwohl man springen und mit wörtlichen Notation gehen würde, Ich denke, es ist wichtig, sich daran zu erinnern, dass die wörtliche Notation umständlich sein kann und die meiste Zeit mehr verwirren wird.

Selbstverständlich, wenn Sie eine Seite entwickeln, die wirklich den Geschwindigkeitsschub braucht, wörtliche Schreibweise ist das, was Sie suchen, aber bewusst sein, dass manchmal auf CF8, wird es ein seltsames Verhalten produzieren.

Nur du die Art von Tests zu zeigen, dass ich laufen:

<cfset aLiterals = arrayNew(1) /> 
<cfset aDirect = arrayNew(1) /> 

<cfsilent> 
    <cfloop from="1" to="10000" index="mm"> 

     <!--- LITERAL ---> 
     <!--- start timer ---> 
     <cfset start = getTickcount() /> 
     <cfloop from="1" to="1000" index="ii"> 
      <cfset user = {Fname = "MyFirstnam", Lname = "MyLastName", titles = ['Mr','Dr']} /> 
     </cfloop> 
     <!--- end timer ---> 
     <cfset end = getTickCount()> 

     <!--- Display total time ---> 
     <cfset total = end-start> 
     <cfset arrayAppend(aLiterals,total) /> 

     <!--- DIRECT ---> 
     <!--- start timer ---> 
     <cfset start1 = getTickcount() /> 
     <cfloop from="1" to="1000" index="jj"> 
      <cfset user = {} /> 
      <cfset user.Fname = "MyFirstnam" /> 
      <cfset user.Lname = "MyLastName" /> 
      <cfset user.titles = [] /> 
      <cfset ArrayAppend(user.titles,'Mr') /> 
      <cfset ArrayAppend(user.titles,'Dr.') /> 
     </cfloop> 

     <!--- end timer ---> 
     <cfset end1 = getTickCount()> 

     <!--- Display total time ---> 
     <cfset total1 = end1-start1> 
     <cfset arrayAppend(aDirect,total1) /> 
    </cfloop> 
</cfsilent> 

<!--- The cfchart ---> 
<cfchart format="png" xaxistitle="function" yaxistitle="Loading Time (in secs.)"> 
    <cfchartseries type="bar" serieslabel="literal"> 
     <cfchartdata item="literal" value="#arrayAvg(aLiterals)#"> 
    </cfchartseries> 
    <cfchartseries type="bar" serieslabel="direct"> 
     <cfchartdata item="direct" value="#arrayAvg(aDirect)#"> 
    </cfchartseries> 
</cfchart> 

Hope this Ihnen hilft.

+0

Großartig! Genau das, was ich gesucht habe. Vielen Dank. –

+0

Hinweis für Interessierte: für Railo 3.1.2 ist der Unterschied etwas kleiner, aber immer noch signifikant. – Sergii

+0

Sie vergleichen Äpfel nicht mit Äpfeln. Versuchen Sie vielleicht in der zweiten Schleife, die Notation für assoziative Arrays zu verwenden, und führen Sie dann den Leistungstest erneut aus. ZB: '' – yfeldblum

4

Literal Notation ist deklarative Programmierung, nicht prozeduralen Programmierung.

Mit wörtlicher Notation, sagen Sie den Computer, was es Sie wollen, klar und in einem einzigen Schritt. Ohne wörtliche Notation bauen Sie langsam, Stück für Stück und ohne Klarheit, was Sie wollen.

Beachten Sie, dass wörtliche Notation in CF8 umständlich und fehlerhaft ist, am besten. Es sollte selten verwendet werden, und dann nur in einfachen Fällen. Die Literalnotation in CF9 ist in Ordnung.

Für CF8, können Sie Helfer definieren:

Und sie als solche verwendet werden:

var user = $S(
    Fname = "MyFirstnam", 
    Lname = "MyLastName", 
    titles = $A('Mr', 'Dr') 
); 

Diese Helfer die ganze Zeit arbeiten, bewahren struct Schlüsselfall (Strukturschlüssel nicht einfach groß geschrieben Sie werden jedoch bei der Eingabe eingegeben und rekursiv ohne Bindung verschachtelt.

+0

Danke. Ich verstehe den Unterschied, am meisten interessiert mich, ob es einen besonderen Vorteil für die Objektliteralnotation gibt, die Syntaxfehler (verschachtelte Klammern/Kommas) für statische Daten auszugleichen, die einfach so oder so durchgeführt werden können. –

+0

Wie ich eingangs erwähnte, ist die literale Notation eine deklarative Programmierung, bei der der Programmierer seine Absichten kurz und deutlich ausdrückt. Bei der prozeduralen Programmierung beschränkt sich der Programmierer darauf, zu spezifizieren, wie Datenstrukturen langsam und schrittweise aufgebaut werden, und kann seine Absichten nicht prägnant und klar ausdrücken. Der Rest des Posts war eine Klarstellung der wörtlichen Notation und ihrer Verwendung in CF8 vs CF9. Auch wenn man es vielleicht nicht ohne Übung kennt oder nicht verwendet, ist die Syntax kein Fehler - die Syntax befreit den Programmierer stattdessen. – yfeldblum

Verwandte Themen