私の知る限り、経過時間を測定する方法は少なくとも10通りあります。
単調時計ベース:
ProcessInfo.systemUptime。
mach_absolute_timemach_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とcurrentTimeMillisvs nanoTimeに似ています。
他の目的に使用することはできません。その理由は、コンピュータの時計が完璧ではないためです。それは常にドリフトし、時々修正する必要があります。この修正は手動で行われるか、またはほとんどのマシンの場合、実行されてシステムクロック(「ウォールクロック」)に継続的に小さな修正を発行するプロセスがあります。これらは頻繁に発生する傾向があります。うるう秒があるときはいつでも、このような別の修正が行われます。
ここでCFAbsoluteTimeは、起動時間の代わりに実時間を提供します。NSDate壁時計の時間でもあります。
sqrt(number)代わりに停止numberでき、もう少し時間を節約できます。