2010-04-29 5 views
9

Ich möchte im Wesentlichen die getTickCount() - Windows-Funktion rekonstruieren, so dass ich es in Basic C++ ohne irgendwelche Nicht-Standard-Bibliotheken oder sogar die STL verwenden kann. (So ​​erfüllt es die mit dem Android NDK mitgelieferten Bibliotheken)Die Anzahl der System-Ticks mit Basic C++?

ich ausgesehen haben bei

Uhr()

Lokalzeit

Zeit

Aber ich bin Ich bin mir immer noch nicht sicher, ob es möglich ist, die getTickCount-Windows-Funktion mit der Zeitbibliothek zu replizieren.

Kann mir jemand in die richtige Richtung zeigen, wie man das macht oder auch wenn es möglich ist?

Eine Übersicht von dem, was ich tun möchte:

ich in der Lage sein wollen, zu berechnen, wie lange eine Anwendung „tun“, um eine bestimmte Funktion hat.

So zum Beispiel ich möchte in die Lage zu berechnen, wie lange die Anwendung mit einem Server zu registrieren versucht hat,

ich in dem Hafen versuchen es aus den Fenstern auf dem Linux zu laufen basierten Android, hier sind die Fenster Code:


int TimeoutTimer::GetSpentTime() const 
{ 
if (m_On) 
{ 
    if (m_Freq>1) 
    { 
     unsigned int now; 
     QueryPerformanceCounter((int*)&now); 
     return (int)((1000*(now-m_Start))/m_Freq); 
    } 
    else 
    { 
     return (GetTickCount()-(int)m_Start); 
    } 
} 
return -1; 
} 
+0

was versuchen Sie zu erreichen? Es kann Wege geben, es zu tun. Vielleicht treten Sie einen Schritt zurück und erklären das allgemeine Problem. – Tim

+0

Gute Idee, ich möchte in der Lage sein zu berechnen, wie lange eine Anwendung eine bestimmte Funktion "gemacht" hat. So möchte ich zum Beispiel berechnen können, wie lange die Anwendung versucht hat, sich bei einem Server zu registrieren. –

+0

In diesem Fall ist es wahrscheinlich ziemlich trivial, ein Objekt zu finden/zu erstellen, das die verstrichene Zeit ermitteln kann. Suchst du nach Thread/geplanter Zeit oder Gesamtuhr/Wandzeit? – Tim

Antwort

18

Unter Android NDK können Sie den POSIX-Aufruf clock_gettime() verwenden, der Teil von libc ist. Mit dieser Funktion enden verschiedene Android-Timer-Anrufe.

Zum Beispiel java.lang.System.nanoTime() implementiert mit:

struct timespec now; 
clock_gettime(CLOCK_MONOTONIC, &now); 
return (u8)now.tv_sec*1000000000LL + now.tv_nsec; 

diesem Beispiel wird die monotone Uhr, das ist, was Sie wollen, wenn Dauern zu berechnen. Anders als die Wanduhr (verfügbar über gettimeofday()) springt sie nicht vorwärts oder rückwärts, wenn die Uhr des Geräts vom Netzwerkanbieter geändert wird.

Die Linux-Manpage für clock_gettime() beschreibt die anderen möglicherweise verfügbaren Takte, z. B. die verstrichene CPU-Zeit pro Thread.

1

Es ist nicht möglich. Der C++ - Standard und als Folge die Standardbibliothek wissen nichts über Prozessoren oder "Ticks". Dies kann oder kann nicht in C++ 0x mit der Threading-Unterstützung ändern, aber zumindest für den Moment ist es nicht möglich.

1

Haben Sie Zugriff auf eine Vblank Interrupt-Funktion (oder Hblank) auf dem Android? Wenn ja, inkrementieren Sie eine globale, flüchtige Variable für einen Timer.

3

Dies ist plattformabhängig, Sie müssen also nur einen Wrapper schreiben und die Besonderheiten für jede Plattform implementieren.

+0

Auf Android werden nur die sehr grundlegenden C-Bibliotheken zur Verfügung gestellt, was Sie unter c-Bibliothek hier sehen - http://www.cplusplus.com/reference/clibrary/, Es hat keine zusätzlichen plattformspezifischen Extras –

+1

Die C-Bibliothek haben die Zeit.h ist das nicht verfügbar?Es kann Ihnen keine große Zeitauflösung geben, aber sollte für Ihre Bedürfnisse ausreichen. Verwenden Sie clock() mit dem CLOCKS_PER_SEC, um die verstrichene Zeit zu erhalten. – daramarak

+0

@daramarak clock() gibt die Prozesszeit zurück, nicht die Systemzeit. – darron

9

clock() funktioniert sehr ähnlich zu Windows GetTickCount(). Die Einheiten können unterschiedlich sein. GetTickCount() gibt Millisekunden zurück. clock() gibt CLOCKS_PER_SEC Ticks pro Sekunde zurück. Beide haben eine max, die Rollover (für Windows, das ist etwa 49,7 Tage).

GetTickCount() beginnt bei Null, wenn das Betriebssystem gestartet wird. Aus den Dokumenten sieht es so aus, als ob clock() startet, wenn der Prozess das tut. So können Sie Zeiten zwischen Prozessen mit GetTickCount() vergleichen, aber Sie können das wahrscheinlich nicht mit clock() tun.

Wenn Sie versuchen, wie lange etwas zu berechnen ist passiert, in einem einzigen Prozess, und Sie sind über Roll keine Sorgen:

const clock_t start = clock(); 
// do stuff here 
clock_t now = clock(); 
clock_t delta = now - start; 
double seconds_elapsed = static_cast<double>(delta)/CLOCKS_PER_SEC; 

Klarstellung: Es scheint in Unsicherheit zu sein, ob clock() gibt die verstrichene Wandzeit oder Prozessorzeit zurück. Die ersten paar Referenzen, die ich überprüft habe, sagen Wall Time.Zum Beispiel:

Returns the number of clock ticks elapsed since the program was launched.

die zugegebenermaßen ein wenig vage. MSDN ist expliziter:

The elapsed wall-clock time since the start of the process....

Benutzer Darron mich davon überzeugt, tiefer zu graben, so fand ich einen Entwurf Kopie des C-Standard (ISO/IEC 9899: TC2), und es sagt:

... liefert die beste Annäherung der Implementierung der Prozessorzeit verwendet ...

Ich glaube, dass jede Implementierung, die ich jemals verwendet habe, Wanduhrzeit gibt (was ich denke, ist eine Annäherung an die verwendete Prozessorzeit).

Fazit: Wenn Sie versuchen, so zu programmieren, damit Sie verschiedene Optimierungen vergleichen können, dann ist meine Antwort angemessen. Wenn Sie versuchen, ein Zeitlimit basierend auf der tatsächlichen Wanduhrzeit zu implementieren, müssen Sie Ihre lokale Implementierung von clock() überprüfen oder eine andere Funktion verwenden, die dokumentiert ist, um die vergangene Wanduhrzeit anzugeben.

Update: Mit C++ 11 gibt es auch den Teil der Standard-Bibliothek, die eine Vielzahl von Uhren und Typen zur Erfassung von Zeiten und Zeiträumen bietet. Obwohl standardisiert und weit verbreitet, ist es nicht klar, ob der Android NDK vollständig unterstützt wird.

+0

Dies ist nicht wahr. clock() gibt die vom Prozess verbrachte Zeit zurück, die normalerweise viel kleiner ist als die gesamte Systemzeit. – darron

+0

@darron: Ich habe nicht gesagt, dass clock() die Systemzeit zurückgibt. In der Tat habe ich auf diesen Unterschied im zweiten Absatz hingewiesen. Die Frage wurde nach einer Möglichkeit gefragt, wie lange man mit Standard-C++ - Bibliotheken arbeiten kann. Meine Antwort erklärt, wie man das macht. –

+0

Nun, der erste und der letzte Absatz scheinen die Existenz des zweiten zu ignorieren. Der Beispiel-Code gibt Ihnen SPENT Zeit für den Prozess selbst, nicht Wanduhrzeit seit 'Start'. Also, wenn Sie einen sehr leichten Prozess haben, der tagelang läuft, ist die Uhr vielleicht nur 5 Sekunden lang. Es ist überhaupt nicht ähnlich wie GetTickCount(), abgesehen davon, dass man etwas falsch abtastet. Ich weiß, das ist eine alte Frage/Antwort, aber die Leute finden immer noch diese Dinge und versuchen, die bereitgestellten Informationen zu verwenden. – darron

Verwandte Themen