iOS/Macで提供しているタイマー精度のことはじめ
Mac OS X上だとNSTimer scheduledTimerWithTimeIntervalの精度がやけに良い。何と±0.1msec。ちなみに別スレッドでnanosleepだと2msくらい。どういうこと?あ、iOSは未確認です。
2010-11-04 19:48:13NSThreadのプライオリティを標準の0.5から1.0にしてもnanosleep()は改善せず。NSTimerスゲーっ。計測にはmach_absolute_time()を使ってますよ。
2010-11-04 19:51:18GCDのDispatch Sourceを使ったタイマーの場合は0.2msec程度の誤差。うーんうーん、一番悪いと思っていたNSTimerが一番精度が良かった…。
2010-11-04 20:12:58@hkato193 Queueはどれでしょうか? というかタイマーなんてずれてなんぼだと思いますけども。realtime osじゃないわけですし。
2010-11-04 20:28:05NSTimerはCFRunLoop内でMachのtimer使ってtimeout待ち、そのあとすぐselector実行。Dispatch SourceのTIMERは、keventチェックするthreadがkevent使ってtimeout待ち
2010-11-04 22:07:49そのあと指定のDispatch QueueにBlock追加。Global Queue、Serial Queueはその次のコンテキストスイッチあたりで起動、Main QueueはRunLoop回らないと回ってこない。
2010-11-04 22:09:11keventというかBSDのsystem callもMachにのってると思うので精度はどっこいでしょうから、Dispatch SourceのTIMERからのBlock起動が遅いのはpthread 2つ以上コンテキストスイッチしないといけないため。
2010-11-04 22:13:34@splhack 3秒でそんなに!NSTimerの無負荷テストの結果がやたら良いのにビビりましたので、NSTimerのスケジュールを別のランループでできないかなあと、まだレファレンスを見てないですが考え中です。
2010-11-05 09:25:14メモ1/4 RT @splhack: NSTimerはCFRunLoop内でMachのtimer使ってtimeout待ち、そのあとすぐselector実行。Dispatch SourceのTIMERは、keventチェックするthreadがkevent使ってtimeout待ち
2010-11-05 09:25:45メモ 2/4 RT @splhack: そのあと指定のDispatch QueueにBlock追加。Global Queue、Serial Queueはその次のコンテキストスイッチあたりで起動、Main QueueはRunLoop回らないと回ってこない。
2010-11-05 09:25:58メモ 3/4RT @splhack: keventというかBSDのsystem callもMachにのってると思うので精度はどっこいでしょうからDispatch SourceのTIMERからのBlock起動が遅いのはpthread 2つ以上コンテキストスイッチしないといけないため
2010-11-05 09:26:29@hkato193 別のRunLoopでやるということは、そのタイマーによる発呼でthread間通信を行うということになりそうですので、ほとんどDispatch SourceのTimerと同じことになるんじゃないかと予想します。
2010-11-05 09:27:16メモ 4/4 RT @splhack: @hkato193 別のRunLoopでやるということは、そのタイマーによる発呼でthread間通信を行うということになりそうですので、ほとんどDispatch SourceのTimerと同じことになるんじゃないかと予想します。
2010-11-05 09:30:07@TeamMOSA2 大丈夫です。私もpthreadを自分のアプリで使ってますw。ただ、色んなタイマーを比較しておきたいなあと。 http://bit.ly/bToyYl
2010-11-05 09:34:32iOSで指定時間待つ方法 pthread_cond_timedwait, pthread_cond_timedwait_relative_np, select, kevent, nanosleep, dispatch_after, dispatch_source+TIMER
2010-11-05 09:35:38@hkato193 usleep,sleepはnanosleep使ってるのでパス。CPU離さないので本当に最後の手段です。
2010-11-05 09:38:52NSTimerはCFRunLoopTimerとtoll-free bridgedなのでCFRunLoop.cを読みましょう http://bit.ly/cTq3ts
2010-11-05 09:40:31@splhack sleep系って、ある程度のしきい値でビジーループかそうでないかを決めていたような。今Source Browserで探してますが(見つかっていない)
2010-11-05 09:40:40Advanced Synchronization in Mac OS X: Extending Unix to SMP and Real-Time http://bit.ly/ayYIUp
2010-11-05 10:07:14