For profiling app performance, it's necessary to accurately time your code. The best way to do this is to use mach_absolute_time. In conjunction with mach_timebase_info, you can get extremely high resolution timing to ease performance benchmarking.
I've wrapped this functionality up in a little class to make it super easy to use.
// MachTimer.h #include <mach/mach_time.h> @interface MachTimer : NSObject { uint64_t timeZero; } + (id) timer; - (void) start; - (uint64_t) elapsed; - (float) elapsedSeconds; @end
// MachTimer.m #import "MachTimer.h" static mach_timebase_info_data_t timeBase; @implementation MachTimer + (void) initialize { (void) mach_timebase_info( &timeBase ); } + (id) timer { #if( __has_feature( objc_arc ) ) return [[[self class] alloc] init]; #else return [[[[self class] alloc] init] autorelease]; #endif } - (id) init { if( (self = [super init]) ) { timeZero = mach_absolute_time(); } return self; } - (void) start { timeZero = mach_absolute_time(); } - (uint64_t) elapsed { return mach_absolute_time() - timeZero; } - (float) elapsedSeconds { return ((float)(mach_absolute_time() - timeZero)) * ((float)timeBase.numer) / ((float)timeBase.denom) / 1000000000.0f; } @endYou'd use it like this:
MachTimer* aTimer = [MachTimer timer]; [self performSomeOperation]; NSLog( @"performSomeOperation took %f seconds", [aTimer elapsedSeconds] );I've used this code for iOS and Mac OS apps, and it works great.
No comments:
Post a Comment