mirror of
https://github.com/zhigang1992/RestKit.git
synced 2026-04-03 09:45:10 +08:00
130 lines
3.1 KiB
Objective-C
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
|