2012-10-08 2 views
8

Je développe en utilisant ColdFusion et je voulais savoir quelle est la meilleure stratégie pour boucler sur un grand ensemble de résultats de requête. Y a-t-il une différence de performance entre l'utilisation de cfloop et cfoutput? Si non, y a-t-il une raison de préférer l'un à l'autre?cfloop vs cfoutput sur les requêtes

Répondre

12

Je crois qu'il y avait. Je pense que cette différence a été abordée, le mieux étant de faire un test pour chacun de tester dans votre cas d'utilisation spécifique.

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

Il existe cependant des différences notables. cfoutput peut faire des boucles groupées, ce qui ne peut pas cfloop.

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

Pour cfoutput vous pouvez spécifier le startrow et le maxrows (ou le nombre) pour paginer votre résultat. Pour cfloop, vous devez spécifier l'index endrow au lieu du nombre.

De même, vous ne pouvez pas utiliser cfoutput pour une requête imbriquée dans une balise existante cfoutput, vous devez d'abord terminer le fichier contenant cfoutput.

+3

Dans ColdFusion 10, vous pouvez désormais effectuer une sortie groupée. – ale

+1

Nice, je suppose que vous voulez dire groupés cfloops http://www.bennadel.com/blog/2359-ColdFusion-10-Using-The-Group-Attribute-With-CFLoop-To-Group-Query-Rows.htm –

+0

Même chose pour Railo 4.0 –

1

Il n'y aurait pas de différence de performance en utilisant l'une ou l'autre méthode, cela dépend vraiment de votre style de codage. Si vous mettez un <cfoutput> en haut et en bas de chaque page, alors utiliser <cfloop> fonctionnera très bien. Si vous utilisez plusieurs <cfoutput> et seulement l'endroit où ils sont nécessaires qui fonctionne aussi bien.

Personnellement, je mets <cfoutput> seulement là où c'est nécessaire, mais je ne dirais pas que c'est plus correct que de les placer en haut et en bas de la page.

+0

Vous avez oublié de mentionner la possibilité de pouvoir utiliser group = "" uniquement avec cfoutput (Railo 4 permet le groupe sur boucle). – Busches

2

Je crois qu'il est tout de même que la performance, Ben Forta

Et le reste est à peu près préférence personnelle pour autant que la façon dont vous « comme » de travailler avec votre boucle. Gardez à l'esprit que vous devez toujours définir vos variables, mais à l'intérieur d'une boucle cfoutput qui serait particulièrement importante car les champs de requête "pourraient" être référencés sans se référer à leur portée. Une des raisons pour lesquelles vous préférerez l'approche cfloop serait que vous deviez "échapper" cfoutput pendant votre boucle pour une raison quelconque. Je l'ai déjà rencontré plusieurs fois, donc je préfère généralement cfloop.

3

Une bonne raison d'utiliser cfloop au lieu de cfoutput est que si vous avez besoin de boucler une sortie de requête dans une autre sortie de requête, cfoutput ne prend pas en charge la sortie de requête imbriquée. Vous pouvez cependant vous en sortir en utilisant cfloops. Alors:

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

ne fonctionne pas, mais si vous remplacez les cfoutputs avec cfloops, il.

A partir de CF10, avec la possibilité de regrouper cfloops, c'est la seule différence fonctionnelle restante. Ils font tous les deux la même chose.