|
Accurate Timing For Profiling
Submitted by |
When trying to get accurate frame rate or other timing info in order to profile
your code, the normal clock routines leave you hanging. Both
_ftime() and clock() have a resolution of several
milliseconds, so they aren't appropriate for timing very short routines or
getting accurate timings of frame rate (if you use them, your frame rate will
bounce around a lot). Here's a routine that gives you an exact cycle count for
your process, and some tools to interpret the output. Thanks to Aaron O. for
telling me about rdtsc.
#typedef ULONGLONG uint64;
uint64 getCycleCount()
{
uint32 timehi, timelo;
// Use the assembly instruction rdtsc, which gets the current
// cycle count (since the process started) and puts it in edx:eax.
__asm
{
rdtsc
mov timehi, edx;
mov timelo, eax;
}
return ((uint64)timehi << 32) + (uint64)timelo;
} |
To time a routine, call it twice and subtract the two counts:
uint64 time0 = getCycleCount();
// call your routine
myRoutine();
uint64 cycleCount = getCycleCount - time0; |
I usually like to see both the cycle count and the time in milliseconds.
Create a variable called processorSpeed and set it to the number
of cycles per second your machine gets (mine is 300MHz, so processorSpeed =
300000000). Here is some code to format the output nicely:
uint64 processorSpeedMilliseconds = processorSpeed / 1000;
// milliseconds, Megacycles
int ms, Mc;
// ms = (x cycles)(processorSpeed cycles/second) * (1000 ms/second)
// Mc = (x cycles) / (1e6)
ms = cycleCount / processorSpeedMilliseconds;
Mc = cycleCount / 1000000;
printf("Time: %d Megacycles/%d milliseconds", Mc, ms); |
Finally, your frame rate is 1000 / ms. Happy profiling!
Morgan http://graphics3d.com/matrix
Morgan Systems
|
The zip file viewer built into the Developer Toolbox made use
of the zlib library, as well as the zlibdll source additions.
|