Gute Zeilen, schlechte Zeilen – Folge 4

by marcus on 10/07/2003



CFLOOP – CFOUTPUT 1:1 (1:0)

In der CF-Mailingliste kam kürzlich die Frage auf, welche Art von Schleifendurchläufen
bei der Verarbeitung von Querysets performanter ist – CFLOOP oder CFOUTPUT.
Hätte ich in CF 4.x / 5.x noch blind auf CFLOOP getippt (daher stand es nach der ersten Halbzeit auch 1:0 :-), so ist das ganze in
CFMX etwas anders…

Summa summarum: es gibt keine nennenswerten Unterschiede mehr, zumindest keine,
die die eine oder andere Vorgehensweise rechtfertigen. Mal ist CFLOOP schneller,
mal CFOUTPUT, aber in keinem Fall war der Unterschied so nennenswert groß,
dass man wegen der Performance umschwenken sollte, selbst eine mit CFSCRIPT
angelegte Schleife war gleich schnell.
Um aber eine gewisse Konsistenz in den
Quellcode zu bringen, würde ich immer noch
folgende Richtlinien empfehlen:

  • Bei Schleifendurchläufen, in denen eine Ausgabe erfolgt, also HTML zum
    Browser gelangt, sollte CFOUTPUT genutzt werden
  • Ist dies nicht der Fall, also z.B. bei reinen Berechnungen, würde ich CFLOOP
    vorziehen.

Damit es auch dieses Mal wieder etwas zum "Anfassen" gibt, hier noch der Quellcode,
mit dem ich die Messungen durchgeführt habe:

<!---queryset erstellen--->
<cfscript>
   numberOfRecords = 1000; //anzahl der zu erstellenden demo-datensätze
   theQuery = QueryNew("name, strasse, telefon, email");
   QueryAddRow(theQuery, numberOfRecords);
</cfscript>
<!--- 1000 demo-datensätze füllen--->
<cfloop from="1" to="#numberOfRecords#" index="x">
 <cfscript>
   QuerySetCell(theQuery, "name", "name_#x#", x);
   QuerySetCell(theQuery, "strasse", "strasse_#x#", x);
   QuerySetCell(theQuery, "telefon", "telefon_#x#", x);
   QuerySetCell(theQuery, "email", "strasse_#x#", x); 
 </cfscript>
</cfloop>
<cfloop from="1" to="10" index="y">
<!--- <cfoutput query="theQuery"> --->
<!--- <cfloop query="theQuery"> --->
<!--- <cfscript>
   currentName = theQuery.name;
   currentStreet = theQuery.strasse;
   currentPhone = theQuery.telefon;
   currentEmail = theQuery.email;
 </cfscript> --->
 <!--- <cfscript>
   for(x = 1; x lte numberofrecords; x=x+1) {
   writeOutput(theQuery.name[x] & ' ');
   }
 </cfscript> --->
<!--- <cfoutput> #theQuery.Name# </cfoutput> --->
<!--- </cfloop> --->
 <!--- </cfoutput> --->
</cfloop>

Ich habe hierbei jeweils bei den passenden Codestücken die Kommentare wieder
entfernt, so dass ein einfaches Hin- und Herbewegen zwischen den verschiedenen Befehlen
relativ schnell möglich war.

Mich würden natürlich auch die Messwerte anderer interessieren, also wenn jemand
Zeit hat – immer her damit.

Comments on this entry are closed.

Previous post:

Next post: