2017-08-07 5 views
1

iOSで正確な時間を測定するには、mach_absolute_time()を使用する必要があります。またはCACurrentMediaTime()、これはmach_absolute_time()に基づいています。これはthis Apple Q&Aに記載されており、またいくつかのStackOverflow回答(例えばhttps://stackoverflow.com/a/17986909,https://stackoverflow.com/a/30363702)で説明されています。(いつ)iOSでCACurrentMediaTime/mach_system_timeがラップアラウンドしますか?

mach_absolute_time()の値はいつ返されますか? CACurrentMediaTime()によって返される値はいつラップアラウンドされますか?現実的なタイムスパンでこれは起こりますか? mach_absolute_time()の戻り値の型はuint64ですが、実際のタイムパンにどのようにマッピングされているかはわかりません。

答えて

1

mach_absolute_timeは、CPUに依存しているため、ラップするまでにどのくらいの時間が経過しているかはわかりません。シミュレータでは、mach_absolute_timeはナノ秒であるため、UInt64.maxにラップすると585年になります。私のiPhone 7+では、秒当たり24,000,000 mac_absolute_timeで、24000年に換算されています。結論として、mach_absolute_timeでキャプチャされる理論上の最大時間はCPUに基づいて異なりますが、実用的なアプリケーションでこれに遭遇することはありません。この関数へ

繰り返し呼び出しが単調に増加する結果を保証するものではありません:それはあなたが見られる様々なポストと一致し、価値がある何のため

CFAbsoluteTimeGetCurrentdocumentationは、と警告しています。システム時間は、外部時間基準との同期化または明示的なユーザーのクロック変更のために減少する可能性があります。

だから、あなたは間違いなくあなたが正確な経過時間をしたい場合はNSDate/DateまたはCFAbsoluteTimeGetCurrentを使用したくありません。どちらも、単調に増加する値を保証しません。

要するに、このような振る舞いが必要なときは、mach_absolute_timeというメリットがあるので、一般的にはCACurrentMediaTimeを使用しますが、それは数秒間に変換されるので非常に使いやすくなります。そして、それもmach_absolute_timeも現実の時間周期でループすることはありません。

+0

偉大な、ありがとう、それは私を助けた多くの!私はいくつかの他のiDevices(iPad Mini 1、iPad Air 2、iPad Pro First Generation、iPhone 6で24000年以上)とSimulator(ほぼ585年)の値が一貫しています。前述の[Apple Q&A](https://developer.apple.com/library/content/qa/qa1398/_index.html)に記載されているように、私は 'mach_timebase_info'関数を使用しました。 –

関連する問題