Identifying rogue cases – (by that I mean a combination of circumstances that cause a normally well behaved procedure to take forever), is very simple using these profiling tools. For the sake of this example, I’m assuming you have read about profiling, downloaded and added profiling using the autoprofiler, played around with it and come up with a section of code that has a wide variance of execution times, and you want to understand which iterations are taking a long time.
Page Content
hide
Identifying rogues
Lets look at an example
Dim cTimer As cpProfiler.cProcTimer ' some loop cpProfiler.apProfiler_1.Start "Proc:mloop", "(Module1) Proc:mloop" 'apProfiler_1 :apr:slc:0.2 on 7/21/2010 at 1:36:26 PM Set cTimer = cpProfiler.apProfiler_1.Timers("Proc:mloop") ' code A to be investigated Debug.Assert cTimer.soFar < 0.5 ' code B to be investigated Debug.Assert cTimer.soFar < 0.5 cpProfiler.apProfiler_1.Finish "Proc:mloop" 'apProfiler_1 :apr:slc:0.2 on 7/21/2010 at 1:3 ' ' end of loop
Whats happening
We have identified that sometimes the section of code between our start and finish timers takes a long time to execute. We want to halt execution and debug when it happens.
First set up a cproctimer class to use.
Dim cTimer As cpProfiler.cProcTimer ... assign the one being monitored Set cTimer = cpProfiler.apProfiler_1.Timers("Proc:mloop") ... this will halt execution when the time spent on any particular iteration is more than .5 second Debug.Assert cTimer.soFar < 0.5
Note that when you break execution, the timer continues so every time you look at cTimer.soFar it will have increased. If this matters, pause the timer with ctimer.pause before breaking code execution.
Another useful one would be number of iterations, as below where execution will break when the number of times we have been in this loop is 5000 or more.
Debug.Assert cTimer.Iterations < 5000
Summary
Clearly this gives a powerful tool to break execution programatically if certain activities take longer than expected. See here for more on the cproctimer class.