Bench-marking cfdirectory v. java.io.file

Today I’m working on decreasing execution time on a script that does a couple DB querys and cfdirectory lists. After some preliminary testing my gut perception has proven true; the exorbinate execution time is due to cfdirectory.

So I set out to find a faster way of getting file information from directories and sure enough taking things back to Java is the way to go. See my benchmark code below and the results. I’m sure you’ll agree.

        // UNC path to look in
	curDir = '\myuncpath';

	// ftime will hold the execution time
	// fio is our java.io.File object
	ftime = gettickcount();
		fio = createObject('java','java.io.File');
		mylist = fio.init(trim(curDir)).list();
	ftime = gettickcount() - ftime;

I run the exact same thing in cfdirectory (tumblr strips cfml tags from posts or i”d post that here too). The results in my case show: files: 3409, ftime: 31, dtime: 17608.

That’s 3409 files. Java returns a list of names in 31ms while cfdirectory does the same in 17.5 seconds.

Convert an Array to Query in Coldfusion

Look below for a little function I wrote to convert an array to a query. I had to write this to allow for my use of java.io.File.list() rather than cfdirectory due to speed limitations of the latter. More on that with benchmarks later here.

	/*
	* arrayToQuery
	* Allows us to convert an array into a single column query.
	* @author	Ryan Mueller @CreativeNotice
	* @created	10/27/2011
	* @param	{Array}		arr	Array to be converted		{required}
	* @param	{String}	colname	Name for query column	{required}	default=col1
	*/
	public Query function arrayToQuery(required array arr,required string colname='col1'){
		var qry = queryNew(arguments.colname);
		for(i=1;i <= ArrayLen(arguments.arr);i=(i+1)){
			queryAddRow(qry);
			querySetCell(qry,arguments.colname,arr[i]);
		}
		return qry;
	}