2010-03-24 8 views
7

Las versiones más recientes de ColdFusion (creo CF 8 y 9) le permiten crear estructuras con notación literal de objetos similares a JSON.estructuras ColdFusion asignación directa contra la notación literal de objetos

Mi pregunta es, ¿hay beneficios específicos (eficiencia) a la ejecución tal vez usando la notación literal de objetos sobre las asignaciones individuales de los datos que son esencialmente estático?

Por ejemplo:

Con asignaciones individuales que haría algo como esto:

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

mientras que con objetos literales que haría algo así.

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

Ahora bien, este ejemplo es limitada ciertamente simple, pero si títulos fue una matriz de estructuras (Di una matriz de direcciones), la notación literal se vuelve difícil de trabajar.

Respuesta

4

Antes de probar algo, pensé de inmediato que los literales serían más rápidos, ya que crea todo lo que necesita en tiempo de ejecución, y no necesita perder tiempo creando variables, llamando funciones para agregar y todo eso.

entonces me escribió un pequeño ensayo que produce un gráfico con los resultados. Me tienes curiosidad no :-)

Los resultados demuestran que tenía razón, ya que el gráfico muestra una diferencia asombrosa como se puede ver: alt text http://i44.tinypic.com/jiz8lw.jpg

Pero recuerda que si bien uno podría saltar e ir con la notación literal, Creo que es importante recordar que la notación literal puede ser incómoda y la mayoría de las veces confundir más.

Obviamente, si está desarrollando una página que realmente necesita el aumento de velocidad, la notación literal es lo que está buscando, pero tenga en cuenta que a veces en CF8, producirá un comportamiento extraño.

sólo para mostrar el tipo de pruebas corro:

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

la esperanza que esto le ayuda.

+0

¡Genial! Exactamente lo que estaba buscando. Gracias. –

+0

Nota para interesados: para Railo 3.1.2 la diferencia es un poco más pequeña, pero aún significativa. – Sergii

+0

No está comparando manzanas con manzanas. Tal vez en el segundo ciclo, intente utilizar la notación de matriz asociativa y luego vuelva a ejecutar la prueba de rendimiento. Por ejemplo: '' – yfeldblum

4

notación literal es la programación declarativa, no la programación de procedimiento.

Con la notación literal, le dice al ordenador qué es lo que desea de forma clara y en un solo paso. Sin una notación literal, construyes lo que quieres lentamente, pieza por pieza, y sin claridad.

Tenga en cuenta que la notación literal en CF8 es torpe e imperfecto, en el mejor. Raramente debería usarse, y solo en casos simples. La notación literal en CF9 está bien.

Para CF8, puede definir ayudantes:

y usarlos como tales:

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

Estos ayudantes trabajan todo el tiempo, preservar caso clave struct (teclas struct no se uppercased simplemente pero están encajonados mientras los escribiste) y anidan recursivamente sin límite.

+0

Gracias. Entiendo la diferencia, estoy más interesado en si hay una ventaja particular en la notación literal del objeto para compensar las dificultades de sintaxis (paréntesis anidados/comas) para datos estáticos que fácilmente podrían hacerse de cualquier manera. –

+0

Como mencioné al principio, la notación literal es la programación declarativa, donde el programador expresa sus intenciones de manera concisa y clara. En la programación de procedimientos, el programador se reduce a especificar cómo construir las estructuras de datos de forma lenta y paso a paso, y no puede expresar sus intenciones de manera clara y concisa. El resto de la publicación fue una aclaración sobre la notación literal y su uso en CF8 vs CF9. Aunque uno no esté familiarizado con él o no lo use sin práctica, la sintaxis no es un escollo: la sintaxis libera al programador. – yfeldblum

Cuestiones relacionadas