私の知る限り、経過時間を測定する方法は少なくとも10通りあります。
単調時計ベース:
ProcessInfo.systemUptime
。
mach_absolute_time
mach_timebase_info
述べたように、この答え。
clock()
中POSIX標準。
times()
中POSIX標準。(ユーザー時間とシステム時間を考慮する必要があり、子プロセスが関与するため、複雑すぎます。)
DispatchTime
(マッハタイムAPIのラッパー)受け入れられた回答でJeremyPによって言及されています。
CACurrentMediaTime()
。
壁掛け時計ベース:
(それらをメトリックに使用しないでください:以下の理由を参照してください)
NSDate
/ Date
他の人が言及したように。
CFAbsoluteTime
他の人が述べたように。
DispatchWallTime
。
gettimeofday()
中POSIX標準。
オプション1、2、3については以下で詳しく説明します。
オプション1:Foundationでプロセス情報API
do {
let info = ProcessInfo.processInfo
let begin = info.systemUptime
// do something
let diff = (info.systemUptime - begin)
}
ここdiff:NSTimeInterval
で、秒単位の経過時間です。
オプション2:Mach C API
do {
var info = mach_timebase_info(numer: 0, denom: 0)
mach_timebase_info(&info)
let begin = mach_absolute_time()
// do something
let diff = Double(mach_absolute_time() - begin) * Double(info.numer) / Double(info.denom)
}
ここdiff:Double
で、経過時間はナノ秒単位です。
オプション3:POSIXクロックAPI
do {
let begin = clock()
// do something
let diff = Double(clock() - begin) / Double(CLOCKS_PER_SEC)
}
ここdiff:Double
で、秒単位の経過時間です。
なぜ経過時間の壁時計時間ではないのですか?
のドキュメントCFAbsoluteTimeGetCurrent
:
この関数を繰り返し呼び出しても、単調に増加する結果は保証されません。
理由は、JavaとcurrentTimeMillis
vs nanoTime
に似ています。
他の目的に使用することはできません。その理由は、コンピュータの時計が完璧ではないためです。それは常にドリフトし、時々修正する必要があります。この修正は手動で行われるか、またはほとんどのマシンの場合、実行されてシステムクロック(「ウォールクロック」)に継続的に小さな修正を発行するプロセスがあります。これらは頻繁に発生する傾向があります。うるう秒があるときはいつでも、このような別の修正が行われます。
ここでCFAbsoluteTime
は、起動時間の代わりに実時間を提供します。NSDate
壁時計の時間でもあります。
sqrt(number)
代わりに停止number
でき、もう少し時間を節約できます。