井原プロダクトのBLOG

Since 2013。個人でアプリ作っています。

NSTimerの正確性の検証

検証してみた。以下のプログラムで、NSDateによる時間経過のタイミングと、NSTimerによるタイマーのカウントアップ値の差分を比較。viewControllerをClassとするViewにSTART/STOPボタンを割り付けています。

NSDate : iPhoneの時計の経過により時間を計測
NSTimer : 1/1000に一回カウンターをカウントアップ

NSDate *stdate;
NSDate *datesave;
NSTimer *tm;
int counter;

- (void)viewDidLoad{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void) timeMJ{
    counter ++;
}

- (IBAction)startButton:(UIButton *)sender {
    counter = 0;
    float interval;
    interval = 0.001;
    tm = [NSTimer
          scheduledTimerWithTimeInterval:interval
          target:self
          selector:@selector(timeMJ)
          userInfo:nil
          repeats:YES
          ];
    datesave = [NSDate date];
    [tm fire];
}
- (IBAction)stopButton:(UIButton *)sender {
    [tm invalidate];
    stdate = [NSDate date];
    float x = [stdate timeIntervalSinceDate:datesave];
    NSLog (@"Clock = %.0f Counter = %d 誤差=%.2f%", x*1000, counter,(x*1000-counter)/x/10);

}

iPhone5Sでの実行結果。

Clock = 1868 Counter = 1865 誤差=0.15%
Clock = 1866 Counter = 1862 誤差=0.19%
Clock = 1983 Counter = 1979 誤差=0.21%
Clock = 1967 Counter = 1963 誤差=0.18%
Clock = 1867 Counter = 1864 誤差=0.16%
Clock = 2283 Counter = 2280 誤差=0.14%
Clock = 1917 Counter = 1914 誤差=0.14%
Clock = 2668 Counter = 2657 誤差=0.41%
Clock = 3850 Counter = 3845 誤差=0.13%
Clock = 3217 Counter = 3212 誤差=0.14%
Clock = 2617 Counter = 2614 誤差=0.10%
Clock = 1867 Counter = 1864 誤差=0.14%
Clock = 2182 Counter = 2154 誤差=1.30%
Clock = 2449 Counter = 2445 誤差=0.16%
Clock = 2268 Counter = 2265 誤差=0.12%
Clock = 2050 Counter = 2046 誤差=0.21%
Clock = 2616 Counter = 2613 誤差=0.10%
Clock = 2100 Counter = 2097 誤差=0.15%
Clock = 2034 Counter = 2030 誤差=0.17%
Clock = 2249 Counter = 2103 誤差=6.50%
Clock = 2084 Counter = 2082 誤差=0.12%
Clock = 1767 Counter = 1765 誤差=0.11%

これじゃ、STOP Watchとしてはダメですね。