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としてはダメですね。