Ermittelt den genauen Zeitpunkt des Systemstarts unter iOS / OS X

8

Gibt es eine API, um die NSDate oder NSTimeInterval zu erhalten, die die Startzeit des Systems darstellen? Einige APIs wie [NSProcessInfo systemUptime] und Core Motion geben die Zeit seit dem Start zurück. Ich muss diese Uptime-Werte mit NSDate s bis zu einer Millisekunde genau korrelieren.

Die Zeit seit dem Booten bietet scheinbar mehr Präzision, aber es ist leicht zu sehen, dass NSDate bereits eine Genauigkeit in der Größenordnung von 100 Nanosekunden liefert und alles unter einer Mikrosekunde nur die Interrupt-Latenz und den PCB-Clock-Jitter misst.

Es liegt nahe, die Uptime von der aktuellen Zeit [NSDate date] zu subtrahieren. Aber das setzt voraus, dass sich die Zeit zwischen den beiden Systemaufrufen nicht ändert, was schwer zu erreichen ist. Wenn der Thread zwischen den Anrufen vorweggenommen wird, wird alles hinausgeworfen. Die Problemumgehung besteht darin, den Vorgang mehrmals zu wiederholen und das kleinste Ergebnis zu verwenden, aber yuck.

NSDate muss einen Master-Offset haben, den es verwendet, um Objekte mit der aktuellen Zeit aus der Systembetriebszeit zu generieren, gibt es wirklich keine Möglichkeit, es zu erhalten?

    
Potatoswatter 01.07.2012, 14:46
quelle

5 Antworten

6

In OSX können Sie sysctl () . So funktioniert es mit dem OSX Unix-Dienstprogramm uptime . Quellcode ist verfügbar - suchen Sie nach boottime .

Aber Vorsicht, in iOS habe ich keine Ahnung, ob das funktionieren würde.

UPDATE: habe einen Code gefunden:)

%Vor%

sehen, ob das funktioniert ...

    
Srikar Appalaraju 01.07.2012, 14:56
quelle
2

Die akzeptierte Antwort mit systcl funktioniert, aber die von sysctl für KERN_BOOTTIME zurückgegebenen Werte, zumindest in meinen Tests (Darwin Kernel Version 11.4.2), sind immer ganze Sekunden (das Mikrosekundenfeld) , tv_usec , ist 0). Dies bedeutet, dass die resultierende Zeit bis zu 1 Sekunde betragen kann, was nicht sehr genau ist.

Wenn man diesen Wert mit einem Wert vergleicht, der experimentell aus der Differenz zwischen REALTIME_CLOCK und CALENDAR_CLOCK abgeleitet wurde, unterscheiden sich diese Werte manchmal um einige Sekunden. Daher ist nicht klar, ob der KERN_BOOTTIME -Wert genau der Zeit entspricht -Basis für die Uptime-Uhren.

    
Hank 29.11.2012 19:58
quelle
1

Es gibt einen anderen Weg. Es könnte ein geringfügig anderes Ergebnis (weniger oder mehr) ergeben als die akzeptierte Antwort

Ich habe sie verglichen. Ich bekomme den Unterschied -7 Sekunden für OSX 10.9.3 und +2 Sekunden für iOS 7.1.1

Wie ich es verstehe, gibt diese Methode dasselbe Ergebnis, wenn sich die Wanduhr ändert, aber die angenommene Antwort gibt andere Ergebnisse, wenn sich die Wanduhr ändert ...

Hier Code:

%Vor%     
Speakus 27.06.2014 12:49
quelle
0

Die Routinen in mach / mach_time.h sind im Gegensatz zu NSDate garantiert monoton steigend.

    
hotpaw2 01.07.2012 15:15
quelle
0

Beziehen Sie sich auf diese Kategorie

.h

%Vor%

.m

%Vor%     
Peter Lapisu 03.08.2015 13:51
quelle

Tags und Links