A quick and easy way to measure the performance of a piece of iOS code is to dig down below all the Cocoa Touch stuff and use the low-level mach_absolute_time
. This call returns a tick count that can be converted into nanoseconds using information obtained from themach_timebase_info
call. The following code sketches out the technique:
add
#import <mach/mach_time.h>
double MachTimeToSecs(uint64_t time)
{
mach_timebase_info_data_t timebase;
mach_timebase_info(&timebase);
return (double)time * (double)timebase.numer /
(double)timebase.denom /1e9;
}
- (void)profileDoSomething
{
uint64_t begin = mach_absolute_time();
[selfdoSomething];
uint64_t end = mach_absolute_time();
NSLog(@"Time taken to doSomething %g s",
MachTimeToSecs(end - begin));
}
-(void)doSomething
{
for (int i = 0; i <1000; i++) {
NSLog(@"test");
}
}
The timebase values on the simulator, at least on my MacBook Air, are 1/1, however on the iPad and iPhone 4 they are 125/3; so don’t be lazy and hard code them.
Never assume that because something runs quickly on the simulator it will also run quickly on a target device. On two jobs last year I encountered code that took 100x longer to run an iPad than in the simulator.