Listing 1: FORM.CFM
<!---
FORM.CFM
"Which is faster" app front end.
Ben Forta - ben@forta.com
--->

<CFFORM ACTION="process.cfm">

<TABLE BORDER="1" ALIGN="center">
<TR>
<TH COLSPAN="2" ALIGN="center">
Which is faster?
</TH>
</TR>
<TR>
<TD COLSPAN="2" ALIGN="center">
Title:
<CFINPUT TYPE="text"
NAME="title"
SIZE="50">
</TD>
</TR>
<TR>
<TD COLSPAN="2" ALIGN="center">
Iterations:
<CFINPUT TYPE="text"
NAME="iterations"
VALUE="100"
SIZE="5"
VALIDATE="integer"
REQUIRED="yes"
MESSAGE="Numeric iterations value is required!">
Exclude first iteration:
<INPUT TYPE="checkbox"
NAME="excludefirst"
VALUE="1">
</TD>
</TR>
<TR>
<TD COLSPAN="2">
Preprocess File:<BR>
<INPUT TYPE="text"
NAME="fileprep"
SIZE="50">
</TD>
</TR>
<TR>
<TD>
Title 1:<BR>
<CFINPUT TYPE="text"
NAME="title1"
SIZE="50"
REQUIRED="yes"
MESSAGE="Title is required">
</TD>
<TD>
Title 2:<BR>
<CFINPUT TYPE="text"
NAME="title2"
SIZE="50"
REQUIRED="yes"
MESSAGE="Title is required">
</TD>
</TR>
<TR>
<TD>
File 1:<BR>
<CFINPUT TYPE="text"
NAME="file1"
SIZE="50"
REQUIRED="yes"
MESSAGE="File to process is required">
</TD>
<TD>
File 2:<BR>
<CFINPUT TYPE="text"
NAME="file2"
SIZE="50"
REQUIRED="yes"
MESSAGE="File to process is required">
</TD>
</TR>
<TR>
<TH COLSPAN="4">
<INPUT TYPE="submit"
VALUE="Process">
</TH>
</TR>
</TABLE>

</CFFORM>






Listing 2: process.CFM
<!---
PROCESS.CFM 
"Which is faster" processing. 
Ben Forta - ben@forta.com
--->

<!--- Defaults --->
<CFPARAM NAME="FORM.title" DEFAULT="">
<CFPARAM NAME="FORM.iterations" DEFAULT=0 TYPE="numeric">
<CFPARAM NAME="FORM.excludefirst" DEFAULT="0" TYPE="boolean">
<CFPARAM NAME="FORM.fileprep" DEFAULT="">
<CFPARAM NAME="FORM.title1" DEFAULT="">
<CFPARAM NAME="FORM.title2" DEFAULT="">
<CFPARAM NAME="FORM.file1" DEFAULT="">
<CFPARAM NAME="FORM.file2" DEFAULT="">

<!--- Init vars --->
<CFSET chartformat="flash">
<CFSET chartcolor1="red">
<CFSET chartcolor2="green">
<CFSET timings1=ArrayNew(1)>
<CFSET timings2=ArrayNew(1)>

<!--- Check for required --->
<CFIF (Trim(FORM.title1) IS "")
OR (Trim(FORM.title2) IS "")>
<CFTHROW MESSAGE="Title are required!">
</CFIF>
<CFIF (Trim(FORM.file1) IS "")
OR (Trim(FORM.file2) IS "")>
<CFTHROW MESSAGE="File to execute are required!">
</CFIF>

<!--- Run "silent" --->
<CFSILENT>

<!--- Run preprocess file if specified --->
<CFIF NOT Trim(FORM.fileprep) IS "">
<CFINCLUDE TEMPLATE="#Trim(FORM.fileprep)#">
</CFIF>

<!--- Process first run if needed --->
<CFIF FORM.excludefirst>
<!--- Exclude first run, so run each once --->
<CFINCLUDE TEMPLATE="#Trim(FORM.file1)#">
<CFINCLUDE TEMPLATE="#Trim(FORM.file2)#">
</CFIF>

<!--- Now loop as needed --->
<CFLOOP FROM="1" TO="#FORM.iterations#" INDEX="i">
<!--- Get start value ---->
<CFSET tcstart=GetTickCount()>
<!--- Run the first file --->
<CFINCLUDE TEMPLATE="#Trim(FORM.file1)#">
<!--- Append the timing --->
<CFSET ArrayAppend(timings1, GetTickCount()-tcstart)>
<!--- Get start value ---->
<CFSET tcstart=GetTickCount()>
<!--- Run the second file --->
<CFINCLUDE TEMPLATE="#Trim(FORM.file2)#">
<!--- Get end value --->
<CFSET tcend=GetTickCount()>
<!--- Append the timing --->
<CFSET ArrayAppend(timings2, GetTickCount()-tcstart)>
</CFLOOP>

<!--- No more silent --->
</CFSILENT>

<TABLE ALIGN="center" BORDER="1">
<TR>
<TD COLSPAN="2" ALIGN="center">
<H1><CFOUTPUT>#HTMLEditFormat(Trim(title))#</CFOUTPUT></H1>
</TD>
</TR>
<TR>
<TD COLSPAN="2" ALIGN="center">
<!--- Graph it --->
<CFCHART FORMAT="#chartformat#"
SHOWMARKERS="no">
<CFCHARTSERIES TYPE="line"
SERIESLABEL="#HTMLEditFormat(Trim(title1))#"
SERIESCOLOR="#chartcolor1#">
<CFLOOP FROM="1"
TO="#FORM.iterations#"
INDEX="i">
<CFCHARTDATA ITEM="#i#"
VALUE="#timings1[i]#">
</CFLOOP>
</CFCHARTSERIES>
<CFCHARTSERIES TYPE="line"
SERIESLABEL="#HTMLEditFormat(Trim(title2))#"
SERIESCOLOR="#chartcolor2#">
<CFLOOP FROM="1" TO="#FORM.iterations#" INDEX="i">
<CFCHARTDATA ITEM="#i#"
VALUE="#timings2[i]#">
</CFLOOP>
</CFCHARTSERIES>
</CFCHART>
</TD>
</TR>
<TR>
<TD ALIGN="center">
<H2>Total Execution Time</H2>
<CFCHART FORMAT="#chartformat#"
SHOWLEGEND="no">
<CFCHARTSERIES TYPE="bar"
SERIESCOLOR="#chartcolor1#">
<CFCHARTDATA ITEM="#HTMLEditFormat(Trim(title1))#"
VALUE="#ArraySum(timings1)#">
</CFCHARTSERIES>
<CFCHARTSERIES TYPE="bar"
SERIESCOLOR="#chartcolor2#">
<CFCHARTDATA ITEM="#HTMLEditFormat(Trim(title2))#"
VALUE="#ArraySum(timings2)#">
</CFCHARTSERIES>
</CFCHART>
</TD>
<TD ALIGN="center">
<H2>Average Iteration</H2>
<CFCHART FORMAT="#chartformat#"
SHOWLEGEND="no">
<CFCHARTSERIES TYPE="bar"
SERIESCOLOR="#chartcolor1#">
<CFCHARTDATA ITEM="#HTMLEditFormat(Trim(title1))#"
VALUE="#ArrayAvg(timings1)#">
</CFCHARTSERIES>
<CFCHARTSERIES TYPE="bar"
SERIESCOLOR="#chartcolor2#">
<CFCHARTDATA ITEM="#HTMLEditFormat(Trim(title2))#"
VALUE="#ArrayAvg(timings2)#">
</CFCHARTSERIES>
</CFCHART>
</TD>
</TR>
<TR>
<TD ALIGN="center">
<H2>Fastest Iteration</H2>
<CFCHART FORMAT="#chartformat#"
SHOWLEGEND="no">
<CFCHARTSERIES TYPE="bar"
SERIESCOLOR="#chartcolor1#">
<CFCHARTDATA ITEM="#HTMLEditFormat(Trim(title1))#"
VALUE="#ArrayMin(timings1)#">
</CFCHARTSERIES>
<CFCHARTSERIES TYPE="bar"
SERIESCOLOR="#chartcolor2#">
<CFCHARTDATA ITEM="#HTMLEditFormat(Trim(title2))#"
VALUE="#ArrayMin(timings2)#">
</CFCHARTSERIES>
</CFCHART>
</TD>
<TD ALIGN="center">
<H2>Slowest Iteration</H2>
<CFCHART FORMAT="#chartformat#"
SHOWLEGEND="no">
<CFCHARTSERIES TYPE="bar"
SERIESCOLOR="#chartcolor1#">
<CFCHARTDATA ITEM="#HTMLEditFormat(Trim(title1))#"
VALUE="#ArrayMax(timings1)#">
</CFCHARTSERIES>
<CFCHARTSERIES TYPE="bar"
SERIESCOLOR="#chartcolor2#">
<CFCHARTDATA ITEM="#HTMLEditFormat(Trim(title2))#"
VALUE="#ArrayMax(timings2)#">
</CFCHARTSERIES>
</CFCHART>
</TD>
</TR>
</TABLE>