내가 아는 한, 경과 시간을 측정하는 방법은 최소한 10 가지입니다.
Monotonic Clock 기반 :
ProcessInfo.systemUptime
.
mach_absolute_time
과 mach_timebase_info
에서 언급 한 바와 같이 이 답변 .
clock()
에서 POSIX 표준 .
times()
에서 POSIX 표준 . (사용자 시간과 시스템 시간을 고려해야하고 하위 프로세스가 관련되어 있으므로 너무 복잡합니다.)
DispatchTime
(Mach time API를 둘러싼 래퍼) JeremyP가 수락 한 답변에서 언급했습니다.
CACurrentMediaTime()
.
벽시계 기반 :
(측정 항목에는 절대 사용하지 마세요. 아래 이유를 참조하세요.)
NSDate
/ Date
다른 사람들이 언급했듯이.
CFAbsoluteTime
다른 사람들이 언급했듯이.
DispatchWallTime
.
gettimeofday()
에서 POSIX 표준 .
옵션 1, 2 및 3은 아래에 자세히 설명되어 있습니다.
옵션 1 : Foundation의 Process Info 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
vsnanoTime
와 유사합니다 .
다른 목적으로 사용할 수 없습니다. 그 이유는 컴퓨터의 시계가 완벽하지 않기 때문입니다. 항상 표류하며 때때로 수정해야합니다. 이 수정은 수동으로 이루어 지거나 대부분의 컴퓨터에서 실행되고 시스템 시계 ( "벽 시계")에 대한 작은 수정을 지속적으로 발행하는 프로세스가 있습니다. 이들은 자주 발생하는 경향이 있습니다. 또 다른 수정은 윤초가있을 때마다 발생합니다.
여기 CFAbsoluteTime
에서는 시작 시간 대신 벽시계 시간을 제공합니다. NSDate
벽시계 시간이기도합니다.
sqrt(number)
대신 루프를 멈출 수 있으며number
시간을 조금 더 절약 할 수 있습니다.