I was working on a CFC early this morning (5AM to be precise - don't ask my why - I wake up early) and was having an issue with performance. The CFC was a bug tracker (more info coming soon!) that would get slower as more bugs were added. I needed a nice way to quickly find out what parts of my code were the slowest. On a whim, I quickly wrote up the following custom tag:

<cfparam name="attributes.name">
<cfswitch expression="#thisTag.executionMode#">

  <cfcase value="start">
    <cfset begin = getTickCount()>
  </cfcase>

  <cfcase value="end">
    <cfset total = getTickCount() - begin>
    <cftrace var="total" text="Timer: #attributes.name#">
  </cfcase>
</cfswitch>

To test, I then simply did:

<cf_timer name="block where I do foo">
someOperatation
</cf_timer>

By wrapping various pieces of my code with this tag, I was able to quickly diagnose the problem areas and correct them.

This code was based on a tag I saw in use in the CFAdmin for MX. This code was written by Mike Nimer of Macromedia. When I mentioned to him that I was going to blog this, he let me know that his tag still existed! So, if you don't mind using an unsupported tag, try cfimporting timer from the /cfide/administrator/cftags folder.

<cfimport taglib="/CFIDE/administrator/cftags" prefix="tags">

This tag tags two attributes, inline, which defaults to true, and message, which is the label. If you set inline to false, you will have to manually edit a debug template in order to get the data. It will be accessible in qEvents using a type = 'Timer'. (Did you know you could write your own debug templates for MX?)