2012-10-08 22 views
8

Desarrollé usando ColdFusion y quería saber cuál es la mejor estrategia para recorrer un gran conjunto de resultados de la consulta. ¿Hay alguna diferencia de rendimiento entre el uso de cfloop y cfoutput? Si no, ¿hay alguna razón para preferir uno sobre el otro?cfloop vs cfoutput en las consultas

Respuesta

12

Creo que solía haberlo. Creo que esta diferencia se ha abordado, la mejor opción es hacer una prueba para cada uno para probar en su caso de uso específico.

<cfset t = GetTickCount()/> 
<cf... query="qry"> 
    <!--- Do something ---> 
</cf...> 
<cfset dt = GetTickCount() - t/> 
<cfdump var="#dt#"/> 
<!--- 
If the differences are small you can use java.lang.System.nanoTime() instead 
---> 

Sin embargo, existen algunas diferencias notables. cfoutput puede hacer bucles agrupados, que cfloop no pueden.

<cfoutput query="qry" group="col"> 
    <!--- Loops once for each group ---> 
    <cfoutput> 
    <!--- Loops once for each record within the group ---> 
    </cfoutput> 
</cfoutput> 

Para cfoutput puede especificar el startrow y la maxrows (o el conteo) para paginar su resultado. Para cfloop, debe especificar el índice endrow en lugar del recuento.

También no puede usar cfoutput para una consulta anidada dentro de una etiqueta existente cfoutput, primero deberá finalizar la que contiene cfoutput.

+3

En ColdFusion 10 ahora puede hacer una salida agrupada. – ale

+1

Bueno, supongo que significa agrupado cfloops http://www.bennadel.com/blog/2359-ColdFusion-10-Using-The-Group-Attribute-With-CFLoop-To-Group-Query-Rows.htm –

+0

Lo mismo aplica para Railo 4.0 –

1

No habría una diferencia de rendimiento con ninguno de los dos métodos, depende realmente de su estilo de codificación. Si coloca un <cfoutput> en la parte superior e inferior de cada página, entonces usar <cfloop> funcionará muy bien. Si usa múltiples <cfoutput> y solo el lugar donde se necesitan, también funciona.

Personalmente puse <cfoutput> solo donde son necesarios, pero no diría que es más correcto que colocarlos en la parte superior e inferior de la página.

+0

Olvidó mencionar la posibilidad de poder usar group = "" solo con cfoutput (Railo 4 permite agrupar en bucle). – Busches

2

creo que todo es lo mismo que el rendimiento, Ben Forta

y el resto es más o menos las preferencias personales en cuanto a la forma en que "así como" para trabajar con su lazo. Tenga en cuenta que siempre debe determinar el alcance de sus variables, pero dentro de un bucle cfoutput que sería especialmente importante ya que los campos de consulta "podrían" ser referenciados sin referirse a su alcance.

Una razón por la que preferiría que el enfoque cfloop fuera si necesitara "escapar" de la salida de cf durante su ciclo por algún motivo. Me he topado con eso varias veces, por lo que generalmente prefiero cfloop.

3

Una buena razón para usar cfloop en lugar de cfoutput es si necesita realizar un bucle en un resultado de consulta dentro de otra salida de consulta. Cfoutput no admite la generación de consultas anidadas. Sin embargo, puede salirse con la suya con cfloops. Entonces:

<cfoutput query="test1"> 
    #test1ID# 
    <cfoutput query="test2"> 
     #test2ID# 
    </cfoutput> 
</cfoutput> 

no funciona, pero si reemplaza las cfoutputs con cfloops, lo hará.

A partir de CF10, con la capacidad de agrupar cfloops, esa es la única diferencia funcional restante. Ambos realizan lo mismo.

Cuestiones relacionadas