Files
RestKit/Code/Support/RKBenchmark.m
2012-08-28 17:34:58 -04:00

130 lines
3.1 KiB
Objective-C

//
// RKBenchmark.h
// RestKit
//
// Derived from Benchmark class: https://gist.github.com/1479490
// Created by Sijawusz Pur Rahnama on 03/02/09.
// Copyleft 2009. Some rights reserved.
//
#import "RKBenchmark.h"
@interface RKBenchmark ()
@property (nonatomic, assign, readwrite) CFAbsoluteTime startTime;
@property (nonatomic, assign, readwrite) CFAbsoluteTime endTime;
@property (nonatomic, assign, readwrite) CFTimeInterval elapsedTime;
@property (nonatomic, assign, getter = isStopped) BOOL stopped;
@end
@implementation RKBenchmark
static NSMutableDictionary *__sharedBenchmarks = nil;
+ (NSMutableDictionary *)sharedBenchmarks
{
if (!__sharedBenchmarks) {
__sharedBenchmarks = [[NSMutableDictionary alloc] init];
}
return __sharedBenchmarks;
}
+ (id)instanceWithName:(NSString *)name
{
@synchronized (self) {
// get the benchmark or create it on-the-fly
id benchmark = [[self sharedBenchmarks] objectForKey:name];
if (!benchmark) {
benchmark = [self benchmarkWithName:name];
[[self sharedBenchmarks] setObject:benchmark forKey:name];
}
return benchmark;
}
return nil;
}
@synthesize name = _name;
@synthesize startTime = _startTime;
@synthesize endTime = _endTime;
@synthesize elapsedTime = _elapsedTime;
@synthesize stopped = _stopped;
# pragma mark -
# pragma mark Quick access class methods
+ (id)report:(NSString *)info executionBlock:(void (^)(void))block
{
RKBenchmark *benchmark = [self instanceWithName:info];
[benchmark run:block];
[benchmark log];
return benchmark;
}
+ (CFTimeInterval)measureWithExecutionBlock:(void (^)(void))block
{
RKBenchmark *benchmark = [self new];
[benchmark run:block];
return benchmark.elapsedTime;
}
# pragma mark -
# pragma mark Initializers
+ (id)benchmarkWithName:(NSString *)name
{
return [[self alloc] initWithName:name];
}
- (id)initWithName:(NSString *)name
{
if (self = [self init]) {
self.name = name;
}
return self;
}
# pragma mark -
# pragma mark Benchmark methods
- (void)run:(void (^)(void))executionBlock
{
[self start];
executionBlock();
[self stop];
}
- (void)start
{
self.startTime = CFAbsoluteTimeGetCurrent();
}
- (void)stop
{
self.endTime = CFAbsoluteTimeGetCurrent();
self.stopped = YES;
// Calculate elapsed time
CFDateRef startDate = CFDateCreate(NULL, self.startTime);
CFDateRef endDate = CFDateCreate(NULL, self.endTime);
self.elapsedTime = CFDateGetTimeIntervalSinceDate(endDate, startDate);
CFRelease(startDate);
CFRelease(endDate);
}
- (void)log
{
CFTimeInterval timeElapsed;
if (self.isStopped) {
timeElapsed = self.elapsedTime;
} else {
CFDateRef startDate = CFDateCreate(NULL, self.startTime);
timeElapsed = CFDateGetTimeIntervalSinceDate(startDate, (CFDateRef)[NSDate date]);
CFRelease(startDate);
}
// log elapsed time
if (_name) NSLog(@"Benchmark '%@' took %f seconds.", _name, timeElapsed);
else NSLog(@"Benchmark took %f seconds.", timeElapsed);
}
@end