2010-03-24 13 views
7

Le versioni più recenti di ColdFusion (credo CF 8 e 9) consentono di creare strutture con notazione letterale dell'oggetto simile a JSON.Struttura ColdFusion Assegnazione diretta vs notazione letterale dell'oggetto

La mia domanda è: ci sono vantaggi specifici (efficienza di esecuzione forse) nell'usare la notazione letterale dell'oggetto rispetto ai singoli incarichi per i dati che sono essenzialmente statici?

Ad esempio:

Con singole assegnazioni si farebbe qualcosa di simile:

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

mentre con letterali oggetto si farebbe qualcosa di simile.

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

Ora questo esempio limitato è certamente semplice, ma se film era una matrice di strutture (Say una matrice di indirizzi), la notazione letterale diventa difficile da lavorare.

risposta

4

Prima di provare qualsiasi cosa, ho pensato subito che i letterali sarebbero stati più veloci, poiché si crea tutto ciò che è necessario in runtime e non è necessario perdere tempo a creare variabili, quindi chiamare le funzioni da aggiungere e tutto il resto.

Ho quindi scritto un piccolo test che produce un grafico con i risultati. You got me curioso ci :-)

I risultati dimostrano che avevo ragione, come mostra il grafico mostra una differenza sconcertante come si può vedere: alt text http://i44.tinypic.com/jiz8lw.jpg

Ma ricordate che, anche se si potrebbe saltare e andare con la notazione letterale, Penso che sia importante ricordare che la notazione letterale può essere imbarazzante e che la maggior parte delle volte confonderà di più.

Ovviamente, se stai sviluppando una pagina che ha davvero bisogno di aumentare la velocità, la notazione letterale è ciò che stai cercando, ma ricorda che a volte su CF8, produrrà qualche strano comportamento.

solo per mostrarvi il tipo di test ho eseguito:

<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> 

Spero che questo ti aiuta.

+0

Ottimo! Esattamente quello che stavo cercando. Grazie. –

+0

Nota per gli interessati: per Railo 3.1.2 la differenza è un po 'più piccola, ma comunque significativa. – Sergii

+0

Non stai confrontando le mele con le mele. Forse nel secondo ciclo, provare a utilizzare la notazione associativo-array e quindi eseguire nuovamente il test delle prestazioni. Ad es .: '' – yfeldblum

4

La notazione letterale è una programmazione dichiarativa, non una programmazione procedurale.

Con notazione letterale, si comunica al computer cosa si desidera chiaramente e in un unico passaggio. Senza la notazione letterale, costruisci ciò che vuoi lentamente, pezzo per pezzo e senza chiarezza.

Nota che la notazione letterale in CF8 è scomoda e imperfetta, nella migliore delle ipotesi. Dovrebbe essere usato raramente e solo in casi semplici. La notazione letterale in CF9 va bene.

Per CF8, è possibile definire aiutanti:

e li usa come tale:

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

Questi aiutanti lavorano tutto il tempo, preservare la cassa chiave struct (chiavi struct non sono semplicemente in maiuscolo ma sono incapsulati mentre li hai scritti) e annidati ricorsivamente senza vincoli.

+0

Grazie. Capisco la differenza, mi interessa di più se c'è un particolare vantaggio della notazione letterale dell'oggetto per compensare le insidie ​​della sintassi (parentesi annidate/virgole) per i dati statici che potrebbero essere facilmente eseguiti in entrambi i modi. –

+0

Come ho detto all'inizio, la notazione letterale è la programmazione dichiarativa, in cui il programmatore esprime le sue intenzioni in modo sintetico e chiaro. Nella programmazione procedurale, il programmatore è ridotto a specificare come costruire strutture di dati in modo faticoso e passo dopo passo, e non è in grado di esprimere le sue intenzioni in modo sintetico e chiaro. Il resto del post è stato un chiarimento sulla notazione letterale e il suo uso in CF8 vs CF9. Anche se uno può non averne familiarità o esserne inutilizzato senza pratica, la sintassi non è una trappola: la sintassi libera il programmatore. – yfeldblum

Problemi correlati