iOS時間計測ログをつくる
処理時間を計算するためのログをつくります。
どうやらObjective-C単独のコードで作れないようで, Cの力(gettimeofday)を借りねばならないようです。
NSDate *date = [NSDate date] という方法で時間を取得し, その差分でもいけますが, 計測処理という点では不十分です。
これ自体に処理の時間もかかりますし。
1. インスタンス作成時に計測を開始
2. 処理と処理の間の時間を計測
3. 最初の処理と現在の処理との時間を計測する
という仕様でつくります。
TimeLog.h
#import <Foundation/Foundation.h> #import <sys/time.h> @interface TimeLog : NSObject @property (nonatomic) struct timeval first; @property (nonatomic) struct timeval previous; -(void)log:(NSString *)message; -(void)finish; @end
非常にシンプルです。最初に計測するための時間と一つ前の処理をキープするための変数を用意します。
sys/time を import しておきます。
TimeLog.m
@implementation TimeLog @synthesize first; @synthesize previous; -(id)init { if ( self == [super init] ) { gettimeofday(&first, NULL); gettimeofday(&previous, NULL); } return self; } -(void)log:(NSString *)message { struct timeval now; gettimeofday(&now, NULL); double start = previous.tv_sec * 1000 + previous.tv_usec * 1e-3; double finish = now.tv_sec * 1000 + now.tv_usec * 1e-3; NSLog(@"Check Point: %f ms - %@", finish - start, message); gettimeofday(&previous, NULL); } -(void)finish { struct timeval now; gettimeofday(&now, NULL); double start = first.tv_sec * 1000 + first.tv_usec * 1e-3; double finish = now.tv_sec * 1000 + now.tv_usec * 1e-3; NSLog(@"Final: %f ms - from beggining", finish - start); gettimeofday(&previous, NULL); } @end
NSLogを使ってログをとっています。gettimeofday で現在の時刻を取得しています。
あとはms に変換して, 差分をとります。
使用方法(ARCの場合)
TimeLog *log = [[TimeLog alloc] init]; [log log:@"start"]; // Process [log log:@"end"]; [log finish];
使用方法(ARCでない場合)
TimeLog *log = [[TimeLog alloc] init]; [log log:@"start"]; // Process [log log:@"end"]; [log finish]; [log release];
AppDelegateでstatic などにすれば, アプリケーション全体で計測も可能です。