Verwenden Sie clock
, ProcessInfo.systemUptime
oder DispatchTime
für eine einfache Startzeit.
Soweit ich weiß, gibt es mindestens zehn Möglichkeiten, die verstrichene Zeit zu messen:
Monotone Uhr basiert:
ProcessInfo.systemUptime
.
mach_absolute_time
mit mach_timebase_info
wie in dieser Antwort erwähnt .
clock()
im POSIX-Standard .
times()
im POSIX-Standard . (Zu kompliziert, da wir Benutzerzeit und Systemzeit berücksichtigen müssen und untergeordnete Prozesse beteiligt sind.)
DispatchTime
(ein Wrapper um die Mach-Zeit-API), wie von JeremyP in der akzeptierten Antwort erwähnt.
CACurrentMediaTime()
.
Wanduhr basiert:
(Verwenden Sie diese niemals für Metriken: siehe unten, warum)
NSDate
/ Date
wie von anderen erwähnt.
CFAbsoluteTime
wie von anderen erwähnt.
DispatchWallTime
.
gettimeofday()
im POSIX-Standard .
Option 1, 2 und 3 werden nachstehend erläutert.
Option 1: Verarbeiten der Info-API in Foundation
do {
let info = ProcessInfo.processInfo
let begin = info.systemUptime
// do something
let diff = (info.systemUptime - begin)
}
Wo diff:NSTimeInterval
ist die verstrichene Zeit in Sekunden.
Option 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)
}
Wo diff:Double
ist die verstrichene Zeit in Nanosekunden?
Option 3: POSIX Clock API
do {
let begin = clock()
// do something
let diff = Double(clock() - begin) / Double(CLOCKS_PER_SEC)
}
Wo diff:Double
ist die verstrichene Zeit in Sekunden.
Warum nicht die Wanduhrzeit für die verstrichene Zeit?
In der Dokumentation von CFAbsoluteTimeGetCurrent
:
Wiederholte Aufrufe dieser Funktion garantieren keine monoton steigenden Ergebnisse.
Grund ist ähnlich wie currentTimeMillis
vs nanoTime
in Java :
Sie können das eine nicht für den anderen Zweck verwenden. Der Grund ist, dass keine Computeruhr perfekt ist; es driftet immer und muss gelegentlich korrigiert werden. Diese Korrektur kann entweder manuell erfolgen, oder bei den meisten Maschinen wird ein Prozess ausgeführt, der kontinuierlich kleine Korrekturen an der Systemuhr ("Wanduhr") vornimmt. Diese treten häufig auf. Eine weitere solche Korrektur erfolgt immer dann, wenn eine Schaltsekunde vorliegt.
Hier wird CFAbsoluteTime
die Wanduhrzeit anstelle der Startzeit angegeben. NSDate
ist auch Wanduhrzeit.
sqrt(number)
werdennumber
, und Sie können etwas mehr Zeit sparen - aber es gibt viel mehr Ideen zur Optimierung der Suche nach Primzahlen.