Bildiğim kadarıyla geçen zamanı ölçmenin en az on yolu var:
Monotonik Saat tabanlı:
ProcessInfo.systemUptime
.
mach_absolute_time
ile mach_timebase_info
belirtildiği gibi bu cevap .
clock()
içinde POSIX standardı .
times()
içinde POSIX standardı . (Kullanıcı zamanı ile sistem zamanını dikkate almamız gerektiğinden çok karmaşık ve alt süreçler de dahil.)
DispatchTime
(Mach zamanı API'si etrafında bir sarmalayıcı) JeremyP tarafından kabul edilen yanıtta belirtildiği gibi.
CACurrentMediaTime()
.
Duvar Saati tabanlı:
(bunları asla ölçümler için kullanmayın: aşağıya bakın)
NSDate
/ Date
başkaları tarafından belirtildiği gibi.
CFAbsoluteTime
diğerleri tarafından belirtildiği gibi.
DispatchWallTime
.
gettimeofday()
içinde POSIX standardı .
Seçenek 1, 2 ve 3 aşağıda detaylandırılmıştır.
Seçenek 1: Foundation'da Process Info API'si
do {
let info = ProcessInfo.processInfo
let begin = info.systemUptime
// do something
let diff = (info.systemUptime - begin)
}
diff:NSTimeInterval
saniye cinsinden geçen zaman nerede .
Seçenek 2: Mach C API'si
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
nano saniyelik geçen zaman nerede .
Seçenek 3: POSIX saat API'si
do {
let begin = clock()
// do something
let diff = Double(clock() - begin) / Double(CLOCKS_PER_SEC)
}
diff:Double
saniye cinsinden geçen zaman nerede .
Geçen Zaman İçin Neden Duvar Saati Zamanı Değil?
Belgelerde CFAbsoluteTimeGetCurrent
:
Bu işleve tekrarlanan çağrılar, tekdüze olarak artan sonuçları garanti etmez.
Nedeni benzer currentTimeMillis
vs nanoTime
Java :
Birini diğer amaç için kullanamazsınız. Bunun nedeni, hiçbir bilgisayarın saatinin mükemmel olmamasıdır; her zaman sürüklenir ve bazen düzeltilmesi gerekir. Bu düzeltme manuel olarak gerçekleşebilir veya çoğu makinede, sistem saatinde sürekli olarak küçük düzeltmeler yapan ("duvar saati") bir süreç vardır. Bunlar sıklıkla olma eğilimindedir. Böyle bir başka düzeltme, artık bir saniye olduğunda gerçekleşir.
Burada CFAbsoluteTime
, başlangıç zamanı yerine duvar saati süresi sağlar. NSDate
aynı zamanda duvar saati zamanıdır.
sqrt(number)
yerine durdurulabilirnumber
ve biraz daha fazla zaman kazanabilirsiniz - ancak asal aramaları optimize eden çok daha fazla fikir vardır.