When doing a lot of string concatenation, you should totally use the Java
string buffer:

<cfset jsbOutput = CreateObject( "java", "java.lang.StringBuffer" ).Init()
/>

<cfset jsbOutput.Append( "some text" ) /> 
<cfset jsbOutput.Append( "some text" ) />
<cfset jsbOutput.Append( "some text" ) />
<cfset jsbOutput.Append( "some text" ) />
<cfset jsbOutput.Append( "some text" ) />

<cffile.... Output="#jsbOutput.ToString()#" />


To only does the concatentation once at the end via the ToString() method.
This will make it blazing fast.

This should replace anywhere you build the output for the file.

.......................
Ben Nadel 
www.bennadel.com

-----Original Message-----
From: Rick Root [mailto:[EMAIL PROTECTED] 
Sent: Thursday, August 17, 2006 11:03 AM
To: CF-Talk
Subject: Performance problem

I have some code that dynamically generates CSV, TAB, and EXCEL (HTML
tables) from a query, and it is running pretty slowly.  A lot slower than
I'd like it to.  Essentially, I set a bunch of variables like START_PAGE,
END_PAGE, START_ROW, END_ROW, START_FIELD, and END_FIELD that allow me to
loop through the query and loop through the list of fields and output the
data in the appropriate format.

I added some debugging code and generating 124 rows took 19 seconds. 
Generating 1416 rows took 309 seconds.  Which means if someone wants to
generate a drop with 5,000 rows, it's gonna take a long freakin' time!

It seems like it shouldn't be that slow.  It's only writing every 100 rows
to disk (the 124 record file was 445KB).  And a couple of cflog statements
indicate that the file write takes less than a second.

Here's the query loop that outputs the rows of data.

<cfloop query="resultSet">
        <cfset fileOutput = fileOutput & START_ROW>
        <cfloop list="#fields#" index="ThisColumn">
                <cfset field = evaluate("resultSet.#ThisColumn#")>
                <cfif field eq "" and format eq "EXCEL"><cfset
field="&nbsp;"></cfif>
                <cfset fileOutput = fileOutput & START_FIELD>
                <cfif format eq "CSV">
                        <cfset fileOutput = fileOutput & csvFormat(field)>
                <cfelse>
                        <cfset fileOutput = fileOutput & FIELD>
                </cfif>
        </cfloop>
        <cfset fileOutput = fileOutput & END_ROW>
        <cfif currentRow MOD 100 is 0>
                <cflog text="writing file #now()#">
                <cffile action="APPEND" 
file="#application.udf.ROOT_DIR#\tools\entityLookup3\drops\#filename#" 
output="#fileOutput#" addnewline="No">
                <cflog text="done writing file  #now()#">
                <cfset fileOutput = "">
        </cfif>
</cfloop>

I suspect that it's the Evaluate() that's running slowly.

Any ideas on how to speed this code up?

Thanks!

Rick



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
Introducing the Fusion Authority Quarterly Update. 80 pages of hard-hitting,
up-to-date ColdFusion information by your peers, delivered to your door four 
times a year.
http://www.fusionauthority.com/quarterly

Archive: 
http://www.houseoffusion.com/groups/CF-Talk/message.cfm/messageid:250169
Subscription: http://www.houseoffusion.com/groups/CF-Talk/subscribe.cfm
Unsubscribe: 
http://www.houseoffusion.com/cf_lists/unsubscribe.cfm?user=11502.10531.4

Reply via email to