2010-04-29 16 views
9

In sostanza, voglio ricostruire la funzione di windows getTickCount() in modo che io possa usarla in C++ di base senza alcuna libreria non standard o anche l'STL. (Così è conforme alle librerie fornite con l'NDK Android)Ottenere il tick di sistema con il C++ di base?

ho guardato

orologio()

localtime

tempo

Ma sono non si è ancora sicuri se sia possibile replicare la funzione getTickCount di Windows con la libreria temporale.

Qualcuno può indicarmi la giusta direzione su come farlo o anche se è possibile?

una panoramica di ciò che voglio fare:

io voglio essere in grado di calcolare quanto tempo la domanda è stata "fare" una determinata funzione.

Così, per esempio voglio essere in grado di calcolare quanto tempo l'applicazione ha cercato di registrarsi con un server

sto cercando di portarlo dalle finestre per funzionare su linux basato su Android, ecco le finestre codice:


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

cosa stai cercando di ottenere? Ci possono essere modi per farlo. Forse fare un passo indietro e spiegare il problema generale. – Tim

+0

Buona idea, voglio essere in grado di calcolare per quanto tempo un'applicazione sta "facendo" una determinata funzione. Quindi, per esempio, voglio essere in grado di calcolare per quanto tempo l'applicazione sta cercando di registrarsi con un server –

+0

In tal caso è probabilmente piuttosto semplice trovare/creare un oggetto che possa calcolare il tempo trascorso. Stai cercando thread/orario programmato o tempo complessivo orologio/parete? – Tim

risposta

18

Su Android NDK è possibile utilizzare la chiamata clock_gettime() POSIX, che fa parte di libc. Questa funzione è dove finiscono varie chiamate al timer Android.

Per esempio, java.lang.System.nanoTime() viene implementato con:

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

questo esempio viene utilizzato l'orologio monotona, che è quello che si vuole quando si calcola durate. A differenza dell'orologio da parete (disponibile attraverso gettimeofday()), non salterà avanti o indietro quando l'orologio del dispositivo viene modificato dal gestore di rete.

La pagina man di Linux per clock_gettime() descrive gli altri orologi che potrebbero essere disponibili, come ad esempio il tempo di CPU trascorso per-thread.

1

non è possibile. Lo standard C++ e, come conseguenza, la libreria standard, non conoscono processori o "tick". Questo può o non può cambiare in C++ 0x con il supporto di threading ma almeno per ora, non è possibile.

1

Hai accesso a una funzione di interruzione vblank (o hblank) su Android? Se è così, incrementa una variabile globale, volatile per un timer.

3

Questo dipende dalla piattaforma, quindi è sufficiente scrivere un wrapper e implementare le specifiche per ciascuna piattaforma.

+0

Su Android vengono fornite solo le librerie C di base, ciò che vedi nella libreria c qui - http://www.cplusplus.com/reference/clibrary/, non ha altri extra specifici della piattaforma –

+1

La libreria C ha il tempo.h non è disponibile?Potrebbe non darti una grande risoluzione del tempo, ma dovrebbe essere sufficiente per le tue esigenze. usa clock() con CLOCKS_PER_SEC per ottenere il tempo trascorso. – daramarak

+0

@daramarak clock() restituisce il tempo di elaborazione, non l'ora di sistema. – darron

9

clock() funziona in modo molto simile a Windows GetTickCount(). Le unità potrebbero essere diverse. GetTickCount() restituisce millisecondi. clock() restituisce tick CLOCKS_PER_SEC al secondo. Entrambi hanno un massimo di rollover (per Windows, circa 49,7 giorni).

GetTickCount() inizia da zero all'avvio del sistema operativo. Dai documenti, sembra che clock() inizi quando il processo funziona. In questo modo è possibile confrontare i tempi tra i processi con GetTickCount(), ma probabilmente non è possibile farlo con clock().

se si sta cercando di calcolare quanto tempo qualcosa sta accadendo, all'interno di un unico processo, e non sei preoccupato di rollover:

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; 

Chiarimento: Sembra che ci sia incertezza in se clock() restituisce il tempo di parete trascorso o il tempo del processore. I primi numerosi riferimenti che ho controllato dicono che l'ora del muro.Ad esempio:

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

che è certamente un po 'vago. MSDN è più esplicito:

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

Darron utente mi ha convinto a scavare più a fondo, così ho trovato una bozza del C standard (ISO/IEC 9899: TC2), e dice:

... restituisce migliore approssimazione della realizzazione al tempo del processore utilizzato ...

Credo che ogni implementazione che abbia mai usato dia tempo all'orologio (che suppongo sia un'approssimazione del tempo del processore utilizzato).

Conclusione: Se si sta tentando di eseguire l'ora del codice in modo da poter eseguire il benchmark delle varie ottimizzazioni, la risposta è appropriata. Se si sta tentando di implementare un timeout in base all'orario effettivo dell'orologio a muro, è necessario verificare l'implementazione locale di clock() o utilizzare un'altra funzione documentata per fornire l'ora di uscita a muro scaduta.

Aggiornamento: Con C++ 11, c'è anche la parte della libreria standard, che fornisce una varietà di orologi e tipi per catturare tempi e durate. Sebbene standardizzato e ampiamente disponibile, non è chiaro se Android NDK sia ancora pienamente supportato.

+0

Questo non è vero. clock() restituisce il tempo impiegato dal processo, che di solito è molto più piccolo del tempo totale del sistema. – darron

+0

@darron: non ho detto che clock() restituisce l'ora del sistema. In effetti, ho sottolineato quella differenza nel secondo paragrafo. La domanda ha richiesto un modo per calcolare quanto tempo impiega qualcosa utilizzando le librerie C++ standard. La mia risposta spiega come farlo. –

+0

Bene, il primo e l'ultimo paragrafo sembrano ignorare l'esistenza del secondo. Il codice di esempio ti darà il tempo SPENT sul processo stesso, non sul tempo dell'orologio da muro dall'inizio. Quindi, se hai un processo molto leggero in esecuzione per giorni, l'orologio potrebbe essere solo a 5 secondi. Non è affatto simile a GetTickCount(), oltre ad essere un po 'temporaneo. So che questa è una vecchia domanda/risposta, ma le persone continuano a trovare queste cose e cercano di utilizzare le informazioni fornite. – darron